springmvc+log4j操作日志记录,详细配置
没有接触过的,先了解一下:log4j教程
部分内容来:log4j教程 感谢!
需要导入包:
log包:log4j-12.17.jar
第一步:web.xml配置
<!-- log4j配置,文件路径,因为是跟随项目启动 -->
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/log4j.xml</param-value>
</context-param>
<!-- 配置log4j.xml变量,如果需要动态的就使用下面方式,使用方法${name} -->
<context-param>
<param-name>controller</param-name>
<param-value>controller-log</param-value>
</context-param>
<context-param>
<param-name>loggingLevel</param-name>
<param-value>info</param-value>
</context-param>
<!-- 加载log4j配置文件 -->
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
第二步log4j.xml配置
(配置文件可以有两种方式,一种是xml,一种是properties。个人比较喜欢xml,一目了然)
先讲解一下核心对象:
logger对象: Logger对象负责捕获日志信息及它们存储在一个空间的层次结构。
Appender对象:下位层提供Appender对象。Appender对象负责发布日志信息,以不同的首选目的地,如数据库,文件,控制台,UNIX系统日志等。
layout对象: 该层提供其用于格式化不同风格的日志信息的对象。布局层提供支持Appender对象到发布日志信息之前。
打个比方:logger是个情报站,负责收集他 所在地方(用name="xxx包"指定)下的所有信息。appender是发送出去的方式,如写信(FileAppender)、电报(SMTPAppender)等多种。layout就是发送内容以什么格式书写,如自定义格式(PatternLayout),html(HTMLLayout)格式。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<!-- 可以配置多个appender来对应不同的输出,如文件输出,sql输出,控制台输出,邮件输出等 -->
<!-- [控制台STDOUT] 不同的输出类型对应着不同的calss,如控制台输出class对应着 org.apache.log4j.ConsoleAppender -->
<appender name="console" class="org.apache.log4j.ConsoleAppender"> <!-- name提供给logger或者root调用 -->
<param name="encoding" value="GBK" /> <!-- 保存字符集 -->
<param name="target" value="System.out" /> <!-- 输出到控制台 -->
<layout class="org.apache.log4j.PatternLayout"> <!-- loyout表示输出方式,可以多种,class值区分,PatternLayout表示自定义格式 -->
<param name="ConversionPattern" value="%d{ISO8601} 耗时:%r [日志来自:%-40.40c{3} 日志类型: %-5p 日志内容:%m]%n" /> <!-- 输出格式,后面解释 -->
</layout>
<!--filter过滤器设置输出的级别:ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF
所有下面输出的是debug到warn不会有error和fatal
-->
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="levelMin" value="debug" />
<param name="levelMax" value="warn" />
<param name="AcceptOnMatch" value="true" /> <!-- 答案:http://bbs.csdn.net/topics/350195913 -->
</filter>
</appender> <!-- [公共Appender] 这个class表示输入到文件,并且按日期生成新文件-->
<appender name="DEFAULT-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="${webapp.root}/logs/common-default.log" /> <!-- ${webapp.root}项目根路径,自动获得,不用配置,可自己在web.xml中配置 -->
<param name="Append" value="true" /> <!-- 是否项目重启继续保存之前日志 -->
<param name="encoding" value="GBK" />
<param name="threshold" value="all" /> <!-- 记录所有类型日志,记录它和比它等级高的日志all<debug -->
<param name="DatePattern" value="'.'yyyy-MM-dd'.log'" /> <!-- 日期格式 例子:common-default.log.2015-09-17.log-->
<layout class="org.apache.log4j.PatternLayout"> <!-- 输出方式 -->
<param name="ConversionPattern" value="%d{ISO8601} 耗时:%r [日志来自:%-40.40c{3} 日志类型: %-5p 日志内容:%m]%n" />
</layout>
</appender> <!-- [debug日志APPENDER] -->
<appender name="DEBUG-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="${webapp.root}/logs/controller/debug-log.log" />
<param name="Append" value="true" />
<param name="encoding" value="GBK" />
<param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ISO8601} 耗时:%r [日志来自:%-40.40c{3} 日志类型: %-5p 日志内容:%m]%n" />
</layout>
</appender> <!-- [info日志APPENDER] -->
<appender name="INFO-APPENDER"
class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="${webapp.root}/logs/controller/info-log.log" />
<param name="Append" value="false" />
<param name="encoding" value="GBK" />
<param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ISO8601} 耗时:%r [日志来自:%-40.40c{3} 日志类型: %-5p 日志内容:%m]%n" />
</layout>
<!-- 我只想记录info日志,就做如下设置 -->
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMax" value="info"/>
<param name="LevelMin" value="info"/>
</filter>
</appender> <!-- [组件日志APPENDER] -->
<appender name="COMPONENT-APPENDER"
class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="${webapp.root}/logs/logistics-component.log" />
<param name="Append" value="true" />
<param name="encoding" value="GBK" />
<param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ISO8601} 耗时:%r [日志来自:%-40.40c{3} 日志类型: %-5p 日志内容:%m]%n" />
</layout>
</appender> <!-- debug log -->
<!-- name指定的是包名,表示这个logger只记录com.wzw.controller下的所有日志 -->
<logger name="com.wzw.controller" additivity="true"> <!-- additivity 是否继承root -->
<!-- <level value="${loggingLevel}" /> -->
<level value="DEBUG"></level> <!-- 现在级别 -->
<appender-ref ref="DEBUG-APPENDER" />
</logger> <!-- info log -->
<!-- name指定的是包名,这样只操作此包下的log -->
<logger name="com.wzw.controller" additivity="true">
<level value="INFO"></level>
<appender-ref ref="INFO-APPENDER" />
<appender-ref ref="console"/>
</logger> <!-- Root Logger -->
<!-- 所有logger的父类,记录所有的日志。 -->
<root>
<level value="ALL"></level> <!-- 限定记录等级 -->
<appender-ref ref="DEFAULT-APPENDER" /> <!-- 调用记录方式 -->
<appender-ref ref="console"/>
</root> </log4j:configuration>
运行就能看到common-default.log里面有操作日志
自己输出日志:
我controller包下某各类中:
package com.wzw.controller;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/account")
public class AccountController {
private static Logger logger =LoggerFactory.getLogger(AccountController.class);
@ResponseBody
@RequestMapping("/login")
public String login(HttpSession session){
logger.info("请求登录");
logger.debug("debug");
logger.warn("warn");
}
}
访问这个controller,就会记录日志,因为有log4j中有两个logger配置记录controller包下的日志,所以输出到两个logger下<appender-ref>(输出方式)。
appender选项:
AppenderSkeleton
AsyncAppender
ConsoleAppender
DailyRollingFileAppender
ExternallyRolledFileAppender
FileAppender
JDBCAppender
JMSAppender
LF5Appender
NTEventLogAppender
NullAppender
RollingFileAppender
SMTPAppender
SocketAppender
SocketHubAppender
SyslogAppender
TelnetAppender
WriterAppender
layout选项:
- DateLayout
- HTMLLayout
- PatternLayout
- SimpleLayout
- XMLLayout
模式转换字符:
下表说明了以上模式使用的字符和所有其他字符,可以在自定义模式中使用:
| 转换字符 | 表示的意思 |
|---|---|
| c | 用于输出的记录事件的类别。例如,对于类别名称"a.b.c" 模式 %c{2} 会输出 "b.c" |
| C | 用于输出呼叫者发出日志请求的完全限定类名。例如,对于类名 "org.apache.xyz.SomeClass", 模式 %C{1} 会输出 "SomeClass". |
| d | 用于输出的记录事件的日期。例如, %d{HH:mm:ss,SSS} 或 %d{dd MMM yyyy HH:mm:ss,SSS}. |
| F | 用于输出被发出日志记录请求,其中的文件名 |
| l | 用于将产生的日志事件调用者输出位置信息 |
| L | 用于输出从被发出日志记录请求的行号 |
| m | 用于输出使用日志事件相关联的应用程序提供的消息 |
| M | 用于输出发出日志请求所在的方法名称 |
| n | 输出平台相关的行分隔符或文字 |
| p | 用于输出的记录事件的优先级 |
| r | 用于输出毫秒从布局的结构经过直到创建日志记录事件的数目 |
| t | 用于输出生成的日志记录事件的线程的名称 |
| x | 用于与产生该日志事件的线程相关联输出的NDC(嵌套诊断上下文) |
| X | 在X转换字符后面是键为的MDC。例如 X{clientIP} 将打印存储在MDC对键clientIP的信息 |
| % | 文字百分号 %%将打印%标志 |
格式修饰符:
默认情况下,相关资料原样输出。然而,随着格式修饰符的帮助下,可以改变最小字段宽度,最大字段宽度和对齐。
下表涵盖了各种各样的修饰符的情况:
| Format modifier | left justify | minimum width | maximum width | 注释 |
|---|---|---|---|---|
| %20c | false | 20 | none | 用空格左垫,如果类别名称少于20个字符长 |
| %-20c | true | 20 | none | 用空格右垫,如果类别名称少于20个字符长 |
| %.30c | NA | none | 30 | 从开始截断,如果类别名称超过30个字符长 |
| %20.30c | false | 20 | 30 | 用空格左侧垫,如果类别名称短于20个字符。但是,如果类别名称长度超过30个字符,那么从开始截断。 |
| %-20.30c | true | 20 | 30 | 用空格右侧垫,如果类别名称短于20个字符。但是,如果类别名称长度超过30个字符,那么从开始截断。 |
springmvc+log4j操作日志记录,详细配置的更多相关文章
- 基于SqlSugar的开发框架循序渐进介绍(8)-- 在基类函数封装实现用户操作日志记录
在我们对数据进行重要修改调整的时候,往往需要跟踪记录好用户操作日志.一般来说,如对重要表记录的插入.修改.删除都需要记录下来,由于用户操作日志会带来一定的额外消耗,因此我们通过配置的方式来决定记录那些 ...
- Winform开发框架之权限管理系统改进的经验总结(4)-一行代码实现表操作日志记录
在前面介绍了几篇关于我的权限系统改进的一些经验总结,本篇继续这一系列主体,介绍如何一行代码实现重要表的操作日志记录.我们知道,在很多业务系统里面,数据是很敏感的,特别对于一些增加.修改.删除等关键的操 ...
- 微软企业库5.0 学习之路——第九步、使用PolicyInjection模块进行AOP—PART4——建立自定义Call Handler实现用户操作日志记录
在前面的Part3中, 我介绍Policy Injection模块中内置的Call Handler的使用方法,今天则继续介绍Call Handler——Custom Call Handler,通过建立 ...
- 16.Linux配置环境变量和日志history和Terminal颜色和用户(IP)操作日志记录
$ vim /etc/profile #####################环境变量################################# export TZ='Asia/Shangh ...
- springMVC开启声明式事务实现操作日志记录
第一步.在applicationContext-mvc.xml开启AOP注解扫描 <aop:aspectj-autoproxy/> 第二步.创建增强类,实现日志记录 @Component ...
- IT第二十天 - 面向对象编程思想、抽象类、异常处理、程序操作日志记录、本周总结 ★★★
IT第二十天 上午 面向对象编程思想 1.组装电脑的设计: (1)电脑的组成:显示器+机箱 (2)机箱的组成:电源+主板+硬盘 (3)主板所包含的部件:cpu+内存+PCI接口+usb接口 (4)PC ...
- springAOP实现操作日志记录,并记录请求参数与编辑前后字段的具体改变
本文为博主原创,未经允许不得转载: 在项目开发已经完成多半的情况下,需要开发进行操作日志功能的开发,由于操作的重要性,需要记录下操作前的参数和请求时的参数, 在网上找了很多,没找到可行的方法.由于操作 ...
- Yii2如何添加sql日志记录的配置信息
在使用Yii2框架的时候,常常会出现没有sql日志记录的问题.在代码里一句一句的打印sql语句也不现实.所以就要用文件记录起来. 在 config/web.php 里面的 log配置中增加如下配置 [ ...
- .NetCore中使用AspectCore、ExceptionLess 实现AOP操作日志记录
结合前面封装的ExceptionLess,接下来使用 AspectCore 实现AOP日志处理 nuget导入AspectCore.Core .AspectCore.Extensions.Depend ...
随机推荐
- 《Java4Android》视频学习笔记——为什么用抽象类?
我们来举个例子,然后引出这个问题的答案: 市面上有 喷墨式打印机 和 针式打印机 这两种形式的打印机,我们需要编程来实现他们的 开机,关机以及打印. 构建父类Printer class Printer ...
- phpcms v9 数据源
先到phpcms后台的模块下找到数据源 数据源有两种方式 1,内部数据源 2,外部数据源 这里只做外部数据源.添加一个外部数据源 1)必须填写数据库链接信息,指定一个数据名(在站内调用是使用) 2)进 ...
- Hibernate关联映射(单项多对一和一对多、双向一对多)
最近总是接触着新的知识点来扩展自己的知识面:不停的让自己在原地接触天空的感觉真的很美好!!!革命没有成功,程序员的我们怎么能不努力呢...... 一.用员工和部门来剖析关联映射的原理. 1)从这张截图 ...
- jQuery cxScroll 间歇式无缝滚动
版本: jQuery v1.7+ jQuery cxScroll v1.2.2 注意事项: 内部会自动创建 prev 及 next 切换按钮,也可以在外部直接创建,若外部已创建或设置prevBtn: ...
- 13个风格独特的关于页面(About Pages)设计
如何向其他人呈现你自己和你的作品呢?关于页面的设计是非常重要的,以让你的观众更多地了解你,你的工作和你的想法.这是一个很好的方式来获得更加个性化的展示效果. 设计一个漂亮的关于页面是具有挑战性的.出于 ...
- 使用js实现带有停顿效果的图片滚动(按钮控制)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 马旭飞:共探H3 BPM社区发展战略
近日,以"让天下没有难用的流程"为主题,H3 BPM10.0在北京金隅喜来登酒店正式发布. H3 BPM全新的业务流程管理系统是颠覆BPM行业的巨作,拥有众多独创技术,近200个业 ...
- 27款后台管理页面设计 DIV+CSS+JS
-----------. 演示: http://www.websjy.com/club/websj ... _61040268/index.htm http://www.websjy.com/club ...
- SharePoint 2013 通过HttpModule 管理视图权限
HttpModule工作原理 HttpModule负责监听HttpRequest,当一个HTTP请求到达HttpModule时,整个ASP.NET Framework系统还并没有对这个HTTP请求做任 ...
- C/C++构建系统 -工具汇总
关于构建系统可以先参考百科 http://en.wikipedia.org/wiki/List_of_build_automation_software http://www.drdobbs.com/ ...