统一日志记录系列 java服务AOP拦截器统一日志处理 java服务logback指定某一包或者类下日志记录到不同文件中 由于最近log4j史诗级漏洞不断出现,安全部调研后生产环境所有应用日志记录方式全部切换至logback(连续奋战2个晚上到凌晨才替换完) logback与log4j联系 logback是由log4j创始人设计的另一个开源日志组件。 官网:http:logback。qos。ch logback当前分为下面几个模块: logbackcore:基础模块 logbackclassic:它是log4j的一个改良版本,同时它完整实现了slf4jAPI使你可以很方便地更换成其它日志系统如log4j或JDK14Logging logbackaccess:访问模块与Servlet容器集成提供通过Http来访问日志的功能; logback指定某一包或者类下日志记录到不同文件中的配置如下 lt;?xmlversion1。0encodingUTF8?configurationcontextNamexxxservicecontextNamepropertynameroot。logger。levelvalueINFOpropertynamelog。pathvalueexportapplogspropertynameapp。namevaluexxxservicepropertynamemy。namevaluexxxservicemypropertynamelog。filevalue{log。path}{app。name}。logpropertynamelog。my。filevalue{log。path}{my。name}。logpropertynamelog。rollingFilevalue{log。path}{app。name}。d{yyyyMMdd}。i。log。gzpropertynamelog。my。rollingFilevalue{log。path}{my。name}。d{yyyyMMdd}。i。log。gzencoder!时间戳类名方法名日志级别UUID手机号MAC地址〔请求响应标识〕日志详细内容patternd{yyyyMMddHH:mm:ss。SSS}logger{10}5pmsgnpatternencoderappenderFile{log。file}Fileencoderclassch。qos。logback。classic。encoder。PatternLayoutEncoderImmediateFlushtrueImmediateFlushpatternd{yyyyMMddHH:mm:ss。SSS}logger{10}5pmsgnpatternencoderrollingPolicyclassch。qos。logback。core。rolling。TimeBasedRollingPolicyFileNamePattern{log。rollingFile}FileNamePatternMaxHistory60MaxHistorytimeBasedFileNamingAndTriggeringPolicyclassch。qos。logback。core。rolling。SizeAndTimeBasedFNATPmaxFileSize100MBmaxFileSizetimeBasedFileNamingAndTriggeringPolicyrollingPolicyappenderFile{log。my。file}Fileencoderclassch。qos。logback。classic。encoder。PatternLayoutEncoderImmediateFlushtrueImmediateFlushpatternd{yyyyMMddHH:mm:ss。SSS}logger{10}5pmsgnpatternencoderrollingPolicyclassch。qos。logback。core。rolling。TimeBasedRollingPolicyFileNamePattern{log。my。rollingFile}FileNamePatternMaxHistory60MaxHistorytimeBasedFileNamingAndTriggeringPolicyclassch。qos。logback。core。rolling。SizeAndTimeBasedFNATPmaxFileSize100MBmaxFileSizetimeBasedFileNamingAndTriggeringPolicyrollingPolicyappenderqueueSize5000queueSizediscardingThreshold0discardingThresholdincludeCallerDatafalseincludeCallerDataappenderloggernamecom。xxx。myvalueINFOadditivityfalseloggerrootlevel{root。logger。level}rootconfiguration logback指定某一包或者类下日志记录到不同文件中,重点在这里nameyourpackagename包名可以是类的全路径,也可以是部分包名 logback配置详解 contextName节点 设置日志上下文名称,后面输出格式中可以通过定义contextName来打印日志上下文名称 contextNameikongservicecontextName property节点 用来定义相关变量,通过keyvalue键值对的方式配置,然后在下面的配置文件中通过{key}来访问; propertynameroot。logger。levelvalueinfo appender节点 日志输出组件,主要负责日志的输出以及格式化日志。重要的属性有name和class; 重要属性 name:appender组件的名称,后面给logger指定appender使用; class:appender的具体实现类,常用的有ConsoleAppender、FileAppender、RollingFileAppender; ConsoleAppender:向控制台输出日志内容的组件,只要定义好encoder节点就可以使用。 FileAppender:向文件输出日志内容的组件; RollingFileAppender:采用滚动策略向文件输出日志内容的组件,在日志达到一定条件后生成一个新的日志文件,条件由一下配置决定: File{log。file}Fileencoderclassch。qos。logback。classic。encoder。PatternLayoutEncoderImmediateFlushtrueImmediateFlushpatternd{yyyyMMddHH:mm:ss。SSS}〔X{traceid}〕〔thread〕〔5level〕〔logger{50}〕〔X{requestid}〕msgnpatternencoderrollingPolicyclassch。qos。logback。core。rolling。TimeBasedRollingPolicyFileNamePattern{log。rollingFile}FileNamePatternMaxHistory60MaxHistorytimeBasedFileNamingAndTriggeringPolicyclassch。qos。logback。core。rolling。SizeAndTimeBasedFNATPmaxFileSize100MBmaxFileSizetimeBasedFileNamingAndTriggeringPolicyrollingPolicyappender MaxHistory:记录日志文件的数量,按时间对日志文件倒排,多余的日志文件会删除掉,eg:上面配置文件:保留最近60个日志文件,其他的都删除掉; maxFileSize:每个文件100M,达到这个大小后滚动生成新的日志文件; AsyncAppender将日志先写入一个阻塞队列,引用一个日志记录器从队列消费并记录到目标文件queueSize5000queueSizediscardingThreshold0discardingThresholdincludeCallerDatafalseincludeCallerDataappender queueSize:越大,这是应用程序线程上的阻塞越少。如果异步appender的队列填满,则应用程序线程将被阻止记录新的事件,直到工作线程有机会从队列中删除项目。因此,如果应用程序倾向于产生足够的并发日志事件来填充队列,则增加queueSize将提高吞吐量。但请记住,吞吐量的这种增加只有在应用程序能够淹没现有队列大小并且以堆使用为代价时才有意义。 includeCallerData:从事件日志读取调用者提供的数据可以是昂贵的,你通常会发现,将其设置为false提高性能,除非你有一些定制在你的日志事件提供的数据,你实际上并不会丢失任何数据 neverBlock:将此设置为true将阻止您的应用程序线程发生任何阻塞,但是如果异步appender的内部缓冲区填满,则会以丢失日志事件为代价。 logger以及root节点使用 root节点和logger节点其实都是表示Logger组件。root是最顶层的logger,正常情况getLogger(nameclass)没有找到对应logger的情况下,都是使用root节点配置的logger 如果配置了logger,并且通过getLogger(nameclass)获取到这个logger,输出日志的时候,就会使用这个logger配置的appender输出,同时还会使用rootLogger配置的appender。 additivity 这个属性决定日志是否回流到root 我们可以使用logger节点的additivityfalse属性来屏蔽rootLogger的appender。这样就可以不使用rootLogger的appender输出日志了。 root和logger关系 这俩是父子的关系 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。