java服务-AOP拦截器统一日志处理
java服务-logback指定某一包或者类下日志记录到不同文件中
由于最近log4j史诗级漏洞不断出现,安全部调研后生产环境所有应用日志记录方式全部切换至logback(连续奋战2个晚上到凌晨才替换完)
logback是由log4j创始人设计的另一个开源日志组件。
官网:http://logback.qos.ch
logback当前分为下面几个模块:
logback-core:基础模块
logback-classic:它是log4j的一个改良版本,同时它完整实现了slf4j API使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging
logback-access:访问模块与Servlet容器集成提供通过Http来访问日志的功能;
logback指定某一包或者类下日志记录到不同文件中的配置如下
<?xml version="1.0" encoding="UTF-8"?>
xxx-service
%d{yyyy-MM-dd HH:mm:ss.SSS} | %logger{10} | %5p | %msg%n
${log.file}
true
%d{yyyy-MM-dd HH:mm:ss.SSS} | %logger{10} | %5p | %msg%n
${log.rollingFile}
60
100MB
${log.my.file}
true
%d{yyyy-MM-dd HH:mm:ss.SSS} | %logger{10} | %5p | %msg%n
${log.my.rollingFile}
60
100MB
5000
0
false
logback指定某一包或者类下日志记录到不同文件中,重点在这里 name="your package name" 包名可以是类的全路径,也可以是部分包名
设置日志上下文名称,后面输出格式中可以通过定义 %contextName 来打印日志上下文名称
ikong-service
用来定义相关变量,通过key-value键值对的方式配置,然后在下面的配置文件中通过 ${key}来访问;
日志输出组件,主要负责日志的输出以及格式化日志。重要的属性有name和class;
name :appender组件的名称,后面给logger指定appender使用;
class:appender的具体实现类,常用的有 ConsoleAppender、FileAppender、RollingFileAppender;
ConsoleAppender:向控制台输出日志内容的组件,只要定义好encoder节点就可以使用。
FileAppender:向文件输出日志内容的组件;
RollingFileAppender:采用滚动策略向文件输出日志内容的组件,在日志达到一定条件后生成一个新的日志文件,条件由一下配置决定:
${log.file}
true
%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{traceid}] [%thread] [%-5level] [%logger{50}] [%X{request_id}] %msg%n
${log.rollingFile}
60
100MB
MaxHistory:记录日志文件的数量,按时间对日志文件倒排,多余的日志文件会删除掉,eg:上面配置文件:保留最近60个日志文件,其他的都删除掉;
maxFileSize:每个文件100M,达到这个大小后滚动生成新的日志文件;
AsyncAppender 将日志先写入一个阻塞队列,引用一个日志记录器从队列消费并记录到目标文件
5000
0
false
queueSize:越大,这是应用程序线程上的阻塞越少。如果异步appender的队列填满,则应用程序线程将被阻止记录新的事件,直到工作线程有机会从队列中删除项目。因此,如果应用程序倾向于产生足够的并发日志事件来填充队列,则增加queueSize将提高吞吐量。但请记住,吞吐量的这种增加只有在应用程序能够淹没现有队列大小并且以堆使用为代价时才有意义。
includeCallerData:从事件日志读取调用者提供的数据可以是昂贵的,你通常会发现,将其设置为false提高性能,除非你有一些定制在你的日志事件提供的数据,你实际上并不会丢失任何数据
neverBlock:将此设置为true将阻止您的应用程序线程发生任何阻塞,但是如果异步appender的内部缓冲区填满,则会以丢失日志事件为代价。
root节点和logger节点其实都是表示Logger组件。root是最顶层的logger,正常情况getLogger("name/class")没有找到对应logger的情况下,都是使用root节点配置的logger
如果配置了logger,并且通过getLogger("name/class")获取到这个logger,输出日志的时候,就会使用这个logger配置的appender输出,同时还会使用rootLogger配置的appender。
这个属性决定日志是否回流到root
我们可以使用logger节点的additivity="false"属性来屏蔽rootLogger的appender。这样就可以不使用rootLogger的appender输出日志了。
这俩是父子的关系
Logger的appender根据参数additivity决定是否要叠加root的appender,logger的级别是其自身定义的级别,和root的级别没什么关系。
判断一个类的日志输出情况,首先找到这个类所在的logger(1.如果特别定义了一个类的logger,那么则为这个定义的logger;2.如果没有特别定义logger则默认为root),然后根据以上规则判断出这个logger的appender和level。然后既可以知道这个类的哪些日志会被输出到哪些地方了。
注意:任何一个类只会和一个logger对应,要么是定义的logger,要么是root。
1.如果特别定义了一个类的logger,那么则为这个定义的logger;
2.如果没有特别定义logger则默认为root,判断的关键在于找到这个logger,然后判断这个logger的appender和level。
页面更新:2024-03-03
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号