从浏览器端JavaScript代码进行服务器端日志记录

应用程序日志记录是我们在部署到应用程序服务器上的应用程序中都要做的事情,对吗? 对于大多数Java开发人员而言,使用Log4J或Logback之类的框架似乎都是理所当然的。 但是,我们编写的在那些讨厌的浏览器中运行的代码又如何呢? 我猜想,除了在调试过程中偶尔使用console.log()语句外,我们对JavaScript日志记录的考虑不多。 我发现这种情况非常令人遗憾,因为如今的趋势似乎是将我们的应用程序逻辑转移到浏览器。 有了它,无论我们开发和测试客户端代码的程度如何,浏览器中发生的有趣事件可能都不会被注意到,或者会发生任何错误,可能会证明不必要地难以复制和修复。 在此博客文章中,我将演示一个非常基本的设置,以使用一些非常基本JavaScript和jQuery,以及一个带有Slf4J的简单Spring控制器,记录来自服务器上浏览器的消息。

服务器端代码

假设您已经启动并运行了一个现有的Spring Web应用程序,并且正在使用SLF4J进行应用程序日志记录,我们要做的就是添加一个额外的@Controller来记录所有传入消息。

我们的JSLogger控制器

package it.jdev.demo;import java.lang.invoke.MethodHandles;import javax.servlet.http.HttpServletRequest;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseStatus;@Controller
@RequestMapping(value = "/js-log")
public class JSLogger {private static final Logger LOGGER = LoggerFactory.getLogger(MethodHandles.Lookup.class);@RequestMapping(method = RequestMethod.POST)@ResponseStatus(HttpStatus.NO_CONTENT)public void logError(final HttpServletRequest request, @RequestBody(required = true) final String logMessage) {final String ipAddress = request.getRemoteAddr();final String hostname = request.getRemoteHost();LOGGER.warn("Received client-side logmessage (" + ipAddress + "/" + hostname + "): " + logMessage);}}

JavaScript代码

对于日志记录解决方案JavaScript部分,我们将添加一个名为jdev.js的JS文件。 在其中,我们将定义一个名为JDEV.logging的模块,该模块将包含一个名为logToServer()的方法。 在jQuery的帮助下,此方法将向我们的控制器发送Ajax消息。 只需确保url变量指向在控制器的@RequestMapping中配置的端点即可。

我们JavaScript记录模块

var JDEV = JDEV || {};JDEV.namespace = function(ns_string) {var parts = ns_string.split('.');var parent = JDEV;// strip redundant leading globalif (parts[0] === "JDEV") {parts = parts.slice(1);}for (var i = 0; i < parts.length; i += 1) {// create a property if it doesn't existif (typeof parent[parts[i]] === "undefined") {parent[parts[i]] = {};}parent = parent[parts[i]];}return parent;
};JDEV.namespace('logging');
JDEV.logging = (function() {var logToServer = function(logMessage) {var logEventObject = {"message" : logMessage,"location" : location.href,"browser" : navigator.userAgent,};var logMsg = JSON.stringify(logEventObject);var url = "js-log";$.ajax({type : "POST",url : url,data : logMsg,contentType : "application/json",cache : "false",});}return {logToServer : logToServer,}})();

剩下要做的就是在我们的html页面中包含jQuery和我们的jdev.js文件,而不是使用新的日志记录方法来调用console.log():

接线JS代码

<script src="//code.jquery.com/jquery-1.11.0.min.js"></script><script type="text/javascript" src="js/jdev.js"></script><script type="text/javascript">$(document).ready(function() {JDEV.logging.logToServer("Hi from the browser...");});</script>
</body>
</html>

如果一切设置正确,那么您应该获得类似的日志条目:
WARN : Received client-side logmessage (127.0.0.1/localhost): {"message":"Hi from the browser...","location":"http://localhost:8080/demo/","browser":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.104 Safari/537.36"}

包起来

我已经展示了一种非常简单的设计,可以在服务器端日志中记录源自浏览器端JavaScript代码的条目。 当然,您可以详细说明此示例,例如,通过添加随Ajax调用一起发送日志级别的可能性。

翻译自: https://www.javacodegeeks.com/2014/11/server-side-logging-from-browser-side-javascript-code.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/361394.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle连接字符串记录

<?xml version"1.0" encoding"utf-8"?> <!--有关如何配置 ASP.NET 应用程序的详细信息&#xff0c;请访问https://go.microsoft.com/fwlink/?LinkId301879--> <configuration><configSections><!-- For more information on…

(网页)JS编程中,有时需要在一个方法返回两个个或两个以上的数据

转自脚本之家: 1 使用数组的方式&#xff0c;如下&#xff1a; <html> <head><title>JS函数返回多个值</title> </head> <body><input type"button" onclick"getNames()" value"test" /><script …

(网页)AngularJS 参考手册

指令描述ng-app定义应用程序的根元素。ng-bind绑定 HTML 元素到应用程序数据ng-bind-html绑定 HTML 元素的 innerHTML 到应用程序数据&#xff0c;并移除 HTML 字符串中危险字符ng-bind-template规定要使用模板替换的文本内容ng-blur规定 blur 事件的行为ng-change规定在内容改…

Apache Cassandra和Java入门(第一部分)

在此页面上&#xff0c;您将学到足够的知识来开始使用NoSQL Apache Cassandra和Java&#xff0c;包括如何安装&#xff0c;尝试一些基本命令以及下一步做什么。 要求 要遵循本教程&#xff0c;您应该已经有一个正在运行的Cassandra实例&#xff0c;并且已经在这里进行了10分钟…

vagrant网站中box下载方法

假设需要下载Laravel/homestead这个包。 首先定位到地址&#xff1a;https://app.vagrantup.com/laravel/boxes/homestead/versions/8.0.0 然后直接在后面加上 “providers/virtualbox.box”就可以下载了 (注意virtualbox.box是指供应商的名字&#xff0c;不同供应商提供不同名…

响应式Web设计——最佳指南

2012年被称为智能手机年。根据最近一份调查显示&#xff0c;美国的智能手机覆盖率已达50%。现在确实是提升移动终端用户体验的大好时机。如果你正运营一个网站&#xff0c;那就必须有一个响应式的Web设计&#xff0c;以便可以从移动终端上很好地访问你的网站。如果你还没意识到…

Eclipse扩展的轻量级集成测试

最近&#xff0c;我为Eclipse扩展点评估引入了一个小助手。 辅助程序努力减少通用编程步骤的样板代码&#xff0c;同时增加开发指导和可读性。 这篇文章是希望的后续文章&#xff0c;展示了如何将实用程序与AssertJ定制断言结合使用&#xff0c;以编写针对Eclipse扩展的轻量级…

原生js实现简单的焦点图效果

用到一些封装好的运动函数&#xff0c;主要是定时器 效果为图片和图片的描述定时自动更换 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><style type"text/css">ul,li,p,h3 {padding: 0;…

二:熟悉 TCP/IP 协议

一篇文章带你熟悉 TCP/IP 协议&#xff08;网络协议篇二&#xff09; 同样的&#xff0c;本文篇幅也比较长&#xff0c;先来一张思维导图&#xff0c;带大家过一遍。 一图看完本文 一、 计算机网络体系结构分层 计算机网络体系结构分层计算机网络体系结构分层不难看出&…

NYOJ 451(组合数+全错位)

光棍节的快乐 时间限制&#xff1a;1000 ms | 内存限制&#xff1a;65535 KB难度&#xff1a;2描述光棍们&#xff0c;今天是光棍节。聪明的NS想到了一个活动来丰富这个光棍节。 规则如下&#xff1a; 每个光棍在一个纸条上写一个自己心仪女生的名字&#xff0c;然后把这些纸条…

在Completablefuture和Observable之间转换

Java 8中的CompletableFuture<T>是对T类型的值将来将可用的承诺的高级抽象。 Observable<T>非常相似&#xff0c;但是它承诺将来会出现任意数量的项&#xff0c;从0到无穷大。 异步结果的这两种表示与仅使用一项即可使用Observable而不是CompletableFuture情况非常…

Box 'laravel/homestead' could not be found.

vbox vagrant.box Homestead 都安裝好的情況下。在homestead目錄下&#xff0c;執行vagrant up出錯 Homestead\scripts\文件夹中&#xff0c;打开homestead.rb文件打开homestead.rb文件 把config.vm.box_version settings["version"] || "> 0.4.0"改为…

DOM操作案例之--全选与反选

全选与反选在表单类的项目中还是很常见的&#xff0c;电商项目中的购物车一定少不了这个功能。 下面我只就用一个简单的案例做个演示吧。 <div class"wrap"><table><thead><tr><th><input type"checkbox" id"j_cbA…

沈阳出差归来

两个礼拜的出差终于结束了&#xff0c;现场开发锦江之星晚上熬夜到2点...我们开发着并快乐着&#xff0c;至少有一点是出差最大的收获&#xff0c;如何在高强度的项管中把握每个人的内心活动&#xff0c;在最及时的时候给与最贴心的帮助&#xff0c;以至于能让开发人员得到满足…

带有Swagger的Spring Rest API –公开文档

创建API文档后&#xff0c;将其提供给涉众非常重要。 在理想情况下&#xff0c;此发布的文档将具有足够的灵活性以解决任何最新更改&#xff0c;并且易于分发&#xff08;就成本以及完成此操作所需的时间而言&#xff09;。 为了使这成为可能&#xff0c;我们将利用我在上一篇文…

Laravel 不同环境加载不同的.env文件

假设有4个.env文件。分别为 .env.local .env.dev .env.test .env.prd 方式一 第一步&#xff1a;bootstrap\app.php 加入代码 $envs [local,dev,test,prd]; $env get_cfg_var(env); if(empty($env) || !in_array($env, $envs)){exit(no env files); } $env .env..$env; $app…

伪类 选择器优先级

:link 匹配所有未被点击的链接&#xff1b;a:link{color:red} :visited 匹配所有被点击的链接&#xff1b;a:visited{color:red} :hover 匹配鼠标悬停其上的E元素 a:hover{text-decoration:underline} :active 匹配鼠标已经其上按下&#xff0c;还没有释放的E元素 a:active{…

hinkphp项目部署到Linux服务器上报错“模板不存在”如何解决

检查了服务器上的文件&#xff0c;并没有缺少文件&#xff0c;再次上传文件到服务器&#xff0c;还是报错。莫名其妙&#xff0c;怀疑是代码问题。 仔细检查后&#xff0c;发现是模板的文件名问题&#xff1a; 用过TP的都知道&#xff1a;thinkphp会在$this->display()的时候…

VS2008调试总结

从文件Form1.cs和文件Form1.Designer.cs中&#xff0c;可以看到它们定义了同一个类Form1&#xff0c;并且都有一个关键字partial。该关键字作用是允许类分开定义&#xff0c;并且可以将类定义放在不同的文件里面&#xff08;命名空间必须相同&#xff09;。 总结上述三个文件&a…

使用FizzBu​​zz和JUnitParams进行单元测试

我有时使用FizzBu​​zz向新手演示单元测试的基础。 尽管FizzBu​​zz确实是一个简单的问题&#xff0c;但它也可以用于演示更高级的单元测试技术&#xff0c;例如实现参数化测试。 FizzBu​​zz的可能解决方案之一是&#xff1a; public class FizzBuzz {private static fin…