Java for Web学习笔记(五十):Log(2)配置log4j2
来源:互联网 发布:java开发 英文 编辑:程序博客网 时间:2024/06/13 09:16
相关maven
<!-- log4j-api提供logging的API。这是log4j2中唯一需要在compile时加入,含有你所需的所有类 --><dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.8.1</version> <scope>compile</scope></dependency> <!-- log4j-core含有Log4j 2的实现,根据配置具体实现,而API不需要配置,也选择在运行时。不过配置为compile似乎也没什么问题 --><dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.8.1</version> <scope>runtime</scope></dependency> <!-- log4j-jcl是支持API的adapter。有lib采用Commons Logging API(Log4j),这个adapter可将Log4j 2作为它的实现。 --><!-- 如果我们想看到这些第三方库的log,我们可以采用这种方式,例如httpclient,采用了commons-logging(具体参见 https://hc.apache.org/httpcomponents-client-4.3.x/httpclient-cache/dependencies.html ),通过加入log4j-jcl可以将log通过log4j2,也就是我们自己项目的log来输出。 --><!-- 这个怎么看了,有时也挺烦的。httpclient可以在debug情况下看出交互的包内容。 --><dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-jcl</artifactId> <version>2.8.1</version> <scope>runtime</scope></dependency><!-- log4j-slf4j-impl是SLF4J的adapter,例如C3P0,如果开到DEBUG级别,那log就是眼花缭乱了。 --><dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.8.1</version> <scope>runtime</scope></dependency><!-- log4j-taglib是JSP Tag lib的adapter。和之前一样采用runtime,避免在编译时出现不兼容。 --><dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-taglib</artifactId> <version>2.8.1</version> <scope>runtime</scope></dependency>
配置文件位置
缺省位置
缺省是在console中显示error级别。配置文件依次寻找为
- log4j.configurationFile
- log4j2-test.json 或 log4j2-test.jsn
- log4j2-test.xml
- log4j2.json 或 log4j2.jsn
- log4j2.xml
- 可以在代码中指定位置
开发中缺省位置如下,war包将存放在classpath中。
代码指定配置文件
private static Logger logger = null;/** * 指定log4j2的配置文件 * 参考:http://logging.apache.org/log4j/2.x/log4j-core/apidocs/index.html * * @param file 配置文件名字,建议绝对路径的方式 * @throws FileNotFoundException 异常 * @throws IOException 异常 */public static void initLogger(String file) throws FileNotFoundException,IOException{ ConfigurationSource source = new ConfigurationSource(new FileInputStream(file),new File(file)); Configurator.initialize(null, source); //【注意】必须要初始化之后,才设置logger的值,否则会出错。 logger = LogManager.getLogger(); }
web.xml指定配置文件
<context-param> <param-name>log4jConfiguration</param-name> <param-value>D:\develop\eclipse-jee-mars-2-win32\book\customer-support\conf\log4j2.xml</param-value></context-param>
编写配置文件
一个简单的配置文件
我们先从一个极为简单的配置文件开始<?xml version="1.0" encoding="UTF-8"?><!-- configuration status的级别指的是log4j2自己本身的log,一般WARN就足以。 monitorInterval强烈要求加上,本例表示每5分钟(300秒)重新读取配置文件,我们可以准实时地修改log的级别。 --><configuration status="WARN" monitorInterval="300"> <!-- appenders中定义log的目的地,本例第一个了名字为Console的appender,为SYSTEM_OUT方式输出到Console --> <appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </appenders> <!-- 代码中通过getLogger()获得的logger实例。本例只定义了根looger,采用名字叫做Console的appender,级别为debug --> <loggers> <root level="debug"> <appender-ref ref="Console"/> </root> </loggers></configuration>
appender
在appenders中可以定义多个appender,在实际应用中,我们希望将log记录在文件中,以便事后调阅,相关的appender如下:<configuration ... ...> <!-- 为了方便修改,通常将log目录和log名字定义为一个参数 --> <properties> <property name="logPath">/usr/local/log</property> <property name="logName">mytest</property> </properties> <appenders> ... 其他 appender ... <!-- log文件名字为mytest.log,当达到policy的条件时,将压缩为zip文件,并重新写mytest.log。 压缩文件名字样式在filepattern中定义,本例例子mytest-20170418-1.log.zip,%d{yyyyMMdd}表示以年月日,%i表示序号。%i的最大值在DefaultRolloverStrategy中定义,如果已经达到最大值,则删除-1,将-2改名为-1,如此类推。 --> <RollingFile name="RollingFile" filename="${logPath}/${logName}.log" filepattern="${logPath}/${logName}-%d{yyyyMMdd}-%i.log.zip"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] [%-5level] - %msg%n"/> <Policies> <!-- 当log文件达到25M的时候,需要进行压缩,新起一个log --> <SizeBasedTriggeringPolicy size="25 MB"/> <!-- 当新的1天(根据yyyyMMdd的最小时间间隔确定),需要进行压缩,新起一个log --> <TimeBasedTriggeringPolicy interval="1" modulate="true" /> </Policies> <DefaultRolloverStrategy max="20"/> </RollingFile> </appenders> <loggers> ...... </loggers></configuration>
PatternLayout的pattern
这里定义输出log的样式
- %d{HH:mm:ss.SSS}
- %d{yyyy-MM-dd HH:mm:ss.SSS}
- %d{DEFAULT}
- %d{ISO8601}
- %d{UNIX}
- %d{UNIX_MILLIS}
- 16:20:22.257
- 2017-04-18 16:20:22.257
- 2017-04-18 16:20:22,257
- 2017-04-18T16:20:22,257
- 1492503622
- 1492503622257
我们可以利用线程名字,将请求和响应对应起来
%logger,%c:类名- %c
- %c{2}
- %c{1}
- %c{2.}
- %c{1.}
- cn.wei.flowingflying.chapter10.tictactoe.GlobalListener 全部信息
- tictactoe.GlobalListener 显示最后2个
- GlobalListener 显示最后1个
- cn.we.fl.ch.ti.GlobalListener 缩写2个字母
- c.w.f.c.t.GlobalListener 缩写1个字母
%X{username}
显示ThreadContext中map里面的信息,在后面详细说明Loggers
在loggers中定义一个或多个logger,代码中的logger实例将匹配其中某个。<?xml version="1.0" encoding="UTF-8"?><configuration ... ...> ...... <!-- 为了方便修改,通常将log目录和log名字定义为一个参数 --> <loggers> <!-- root为最基本的根logger,匹配所有的logger实例。--> <root level="warn"> <appender-ref ref="Console" /> </root> <!-- 如果logger实例的前缀cn.wei,则匹配此项。如果additivity为true,则最优匹配,不再往下匹配,即不在匹配root;如果为flase,则继续匹配,本例还匹配root,相当还要在Console中输出,级别为INFO,由本logger确定。--> <logger name="cn.wei" level="info" additivity="false"> <appender-ref ref="WroxFileAppender" /> <MarkerFilter marker="WROX_CONSOLE" onMatch="NEUTRAL" onMismatch="DENY" /> </appender-ref> </logger> <!-- 匹配名字前缀为org.apache的实例。缺省additivity为true,即会在console中显示 --> <logger name="org.apache" level="info"> <appender-ref ref="WroxFileAppender" /> </logger> </loggers></configuration>
Filter
在前面已经提供了fiter的例子<!-- NETUTAL表示继续匹配,直到DENY或者ACCEPT,最后的缺省为ACCEPT,本例maker为WROX_CONSOLE的log要ACCEPT,利用filter可以进行log的过滤 --><logger name="cn.wei" level="info" additivity="false"> <appender-ref ref="WroxFileAppender" /> <MarkerFilter marker="WROX_CONSOLE" onMatch="NEUTRAL" onMismatch="DENY" /> </appender-ref></logger>
除了在logger外,在Appender也可以定义filter,在configuration下面可以定义context-wide的filter。
相关链接: 我的Professional Java for Web Applications相关文章
0 0
- Java for Web学习笔记(五十):Log(2)配置log4j2
- Java for Web学习笔记(五一):Log(3)代码中使用log4j2
- Java for Web学习笔记(四九):Log(1)log很重要
- Java for Web学习笔记(四一):Filter(3)用于Log
- Log4j2 配置笔记(Eclipse+maven+SpringMVC)
- Java for Web学习笔记(二):Web Containers
- JAVA学习笔记(五十)- JDBC Java数据库连接
- Log4j (log for java)
- logfj ( log for java)
- Java for Web学习笔记(二六):JSTL(2)Core Tag(上)
- Java for Web学习笔记(四):Servlet(2)HelloServlet
- Java for Web学习笔记(十二):JSP(2)Tag:directive,declaration,scriptlet,expression
- Java for Web学习笔记(十八):Session(2)Session的使用
- Java for Web学习笔记(二二):EL(2)EL语法
- Java for Web学习笔记(三四):自定义tag(2)Tag
- Java for Web学习笔记(四十):Filter(2)AsyncContext和Filter
- Java for Web学习笔记(四五):WebSocket(2)JavaScript Client
- Java for Web学习笔记(五三):Spring框架简介(2)一些准备
- Spark基础transformation操作实例(Java版)
- #掉过的坑#Java:Color的相等判断
- IO简介
- 使用mybatis自动生成工具,生成对应的类,配置文件,接口
- JVM参数调优
- Java for Web学习笔记(五十):Log(2)配置log4j2
- 面试总结
- git入门-----分支和合并相关命令(branch 、chekout、log、tag)
- Kaggle如何入门?
- Spring+SpringMVC+Mybatis框架搭建
- 多项式加减
- 二叉查找树(二叉搜索树)
- Servlet工作原理
- typescript