Software_programming_Log
2019-11-29
Ref 《Java Web programming》 chapter 11 log
log4j.configurationFile 系统属性, 如果属性存在,从它指定的文件中加载配置。
相应的类路径下找不到各种信息时,Log4j2 可以将自己配置为记录错误和更高级别的日志,并将消息记录到控制台中。
记录器
log4j2 中记录器和分类时同义词,必须在所有需要记录日志的类中使用 Logger 类,通过调用
org.apache.logging.log4j.LogManager 的 getLogger 方法可以获得一个 Logger。
获得 Logger实例之后就可以记录错误,警告和其他消息。
Logger 名称定义了日志的分类,惯例: 使用 Logger的类的完全限定类名。
使用相同的名称或类调用 getLogger 多次将得到完全相同的 Logger 实例,而不是同名的多个实例
Logger 被缓存了。
任何两个不同的 Logger 都可以设置不同的级别,并且可以被赋给 0个或者多个 Appender.
Log4j2 中 Logger 的名称遵守点分隔层次,更具体的 Logger将继承祖先 Logger 的 Level 和 Appender
日志存储器
Appender 控制输出的target 继承体系, 比 level 多了一个 additivity 属性, 其决定 Appender 是添加还是覆盖其继承下来的Appender.
例如: root 记录器被赋给了一个控制台 Appender,而 com.wrox 被赋给了一个文件 Appender,那么写入 com.wrox,
com.wrox.chat 和其他记录器的日志消息将同时被输出到控制台和文件,
而写入 root 或者 com.example.test 记录器的日志消息将同时被输出到控制台。
如果将 com.wrox 的 additivity 属性设置为假,则写入 com.wrox, com.wrox。chat 和其他记录器的日志消息将只被写入文件。
(它们将在这个 Appender 停止)
如果 com.wrox 和 additivity 属性仍然是假,且 com.wrox.shop 有一个 additivity 属性被设置为真(默认)的
syslog.Appenderr, 则写入 com.wrox.shop 的消息将输出到 syslog和文件, 但不会输出到控制台。
=======
Filter 过滤器
提供了一种机制用于检查日志消息是否应该或者如何被输出。
Filter 执行的结果可以是 ACCEPT, DENY 或 NEUTRAL 之一。
Filter 可以被附加到架构的 4个不同截断: 上下文配置, Logger配置, Appender引用, Appender 配置。
当消息被记录时,它的上下文范围内的过滤器将按声明的顺序对消息进行评估。
从前往后级别过滤。
常见模式: 在日志消息中包含 Marker对象,并使用过滤器检查这些 Marker对象,在筛选时尤其有用。
过滤器可以查看消息的内容,消息类型,消息中附加的异常和当前运行线程中存储的数据。
过滤器可以使用一些与当前消息无关的信息决定是否在消息上执行评估,例如 系统事件。
===================================
使用任何日志框架时,都应该为请求添加 鱼标签 %X{id} , %X{username}, 这样就可以将属于相同请求的日志消息进行分组,然后进行分析。
org.apache.logging.log4j.ThreadContext 中存储了当前线程的属性,直到 ThreadContext 被清空。
同一线程中记录的所有事件,在属性被添加到ThreadContext 之后,到该属性被移除之前都可以关联到该属性。
如果有许多并发web请求正在执行,那么为每个请求分配唯一的鱼标签可以帮助你识别出特定请求的所有相关信息。
一个鱼标签通常时一些非常唯一的信息,例如 UUID, ThreadContext 可以存储任何用于区别日志事件的有用信息,
例如登录用户的用户名。
下面的 LoggingFilter 在请求开始时将标签(id) 和会话用户名username添加到 ThreadContext中,并在请求完成时清除
ThreadContext,
因为 log pattern %X{id} 和 %X{username} 打印出这些属性,
因为过滤器支持多个派发器类型,且可以在单个请求中执行多次,所以它只在鱼标签和 username 属性尚未设置时设置它们。且
只在设置鱼标签和 username属性的相同调用中清除 ThreadContext;
log4j2 web app log4j2 https://www.jianshu.com/p/d13c2e50a89c
console
File
2019-12-05
step finallization
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <configuration status="WARN"> 3 4 <properties> 5 <property name="logFilePath">log</property> 6 <property name="logFileName">recode.log</property> 7 <property name="patternTemplate">%d{HH:mm:ss.SSS} [%t] %X{id} %X{username} %-5level %c{36} %l: %msg%n</property> 8 </properties> 9 10 <appenders> 11 <Console name="Console" target="SYSTEM_OUT"> 12 <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> 13 </Console> 14 <!-- synchronization output to local file --> 15 <File name="syn_log" fileName="${web:rootDir}/WEB-INF/logs/log/app.log" append="false"> 16 <PatternLayout pattern="${patternTemplate}"/> 17 </File> 18 19 <!-- ${web:rootDir} : project path --> 20 <RollingFile name="webFileAppender" fileName="${web:rootDir}/WEB-INF/logs/rollingFile/application.log" 21 filePattern="${web:rootDir}/WEB-INF/logs/rollingFile/application-%d{MM-dd-yyyy}-%i.log"> 22 <PatternLayout> 23 <pattern>%d{HH:mm:ss.SSS} [%t] %X{id} %X{username} %-5level %c{36} %l: %msg%n</pattern> 24 </PatternLayout> 25 <Policies> 26 <SizeBasedTriggeringPolicy size="10 MB"/> 27 </Policies> 28 <DefaultRolloverStrategy min="1" max="4" /> 29 </RollingFile> 30 </appenders> 31 <loggers> 32 <root level="warn"> 33 <appender-ref ref="Console"/> 34 </root> 35 <logger name="org.tech.learning" level="info" additivity="false"> 36 <appender-ref ref="syn_log"/> 37 <appender-ref ref="webFileAppender"/> 38 </logger> 39 </loggers> 40 </configuration>