<?xml version="1.0" encoding="UTF-8" ?> <!-- maven项目文件位置: src\main\resources --> <!-- 全局异步 :log4j2.component.properties文件 添加 -DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector --> <!-- status="off" : 用于设置log4j自身内部运行日志输出(只输出到控制台),可以不设置 " --> <!-- monitorInterval="1800" : Log4j能够自动检测修改配置文件和重新配置本身, 设置间隔秒数 --> <configuration status="off"> <properties> <!--变量定义 --> <property name="base_dir">${catalina.base}/logs/home/</property> <property name="base_dir_info_file_name">info</property> <property name="base_dir_error_file_name">error</property> <property name="base_dir_warn_file_name">warn</property> <property name="base_dir_rolling_file_name">rolling</property> <property name="base_dir_file_ext">.log</property> <property name="base_dir_file_old_name">-%d{yyyy-MM-dd-HH}_%i</property> <property name="base_dir_file_old_ext">.log.gz</property> <!-- 发送邮件 --> <property name="mail_subject">error log</property> <property name="mail_from">***@qq.com</property> <property name="mail_smtp_protocol">smtps</property> <property name="mail_smtp_host">smtp.qq.com</property> <property name="mail_smtp_port">465</property> <property name="mail_smtp_user_name">****</property> <property name="mail_smtp_password">****</property> <property name="mail_buffer_size">50</property> <property name="mail_to">***@qq.com</property> <!-- 发送地址 --> <property name="mail_cc">***@qq.com</property> <!-- 抄送地址 --> <property name="mail_reply_to">****@qq.com</property> <!-- 回复邮箱地址 --> <property name="mail_smtp_debug">false</property> <!-- %d{yyyy-MM-dd HH:mm:ss, SSS} : 日志生产时间 %t 输出当前线程名称 %-5level 输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0 %logger 输出logger名称,因为Root Logger没有名称,所以没有输出 %p : 日志输出格式 %c : logger的名称 %m : 日志内容,即 logger.info("message") %n : 换行符 %C : Java类名 %L : 日志输出所在行数 %M : 日志输出所在方法名 %F : 输出所在的类文件名,如Client.java hostName : 本地机器名 hostAddress : 本地ip地址 --> <property name="log_pattern">hostAddress-%d [%t] %-5p %C %M %L -%m%n</property> <!-- 日志切割的最小单位 --> <property name="every_file_size">100M</property> </properties> <appenders> <Console name="console" target="SYSTEM_OUT"> <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) --> <ThresholdFilter level="DEBUG" onMatch="ACCEPT" /> <PatternLayout pattern="${log_pattern}"/> </Console> <!--<File>输出结果到指定文件</File>--> <!--<RollingFile>同样输出结果到指定文件,但是使用buffer,速度会快点</RollingFile>--> <!--filePattern:表示当日志到达指定的大小或者时间,产生新日志时,旧日志的命名路径。--> <!--PatternLayout:和log4j一样,指定输出日志的格式,append表示是否追加内容,值默认为true--> <RollingFile name="infoFile" fileName="${base_dir}${base_dir_info_file_name}${base_dir_file_ext}" filePattern="${base_dir}${base_dir_info_file_name}${base_dir_file_old_name}${base_dir_file_old_ext}"> <PatternLayout pattern="${log_pattern}" /> <Filters> <!-- 如果类中的日志是warn级别,则匹配第一个过滤器,被直接DENY(拒绝),不被记录到文件中 --> <ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL" /> <!-- 如果类中的日志是info级别,则不匹配第一个过滤器,由于采用的是中立的策略,会接着走到第二个过滤器,由 --> <!-- 于匹配第二个,且被accept,则该日志记录到info日志文件中。这样就实现的前面提到的不同级别日志输出到对 --> <!-- 应的日志文件中。 --> <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/> </Filters> <Policies> <!-- 按天分 每隔24小时产生新的日志文件--> <!-- <TimeBasedTriggeringPolicy modulate="true" interval="1"/> --> <!-- 按文件大小分 --> <SizeBasedTriggeringPolicy size="${every_file_size}" /> <!-- 每隔24小时产生新的日志文件--> <TimeBasedTriggeringPolicy/> </Policies> <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件 --> <!-- 如果log4j2 记录的日志达到上限,旧的日志将被删除,腾出的空间用于记录新的日志 --> <DefaultRolloverStrategy max="20"/> </RollingFile> <RollingFile name="warnFile" fileName="${base_dir}${base_dir_warn_file_name}${base_dir_file_ext}" filePattern="${base_dir}${base_dir_warn_file_name}${base_dir_file_old_name}${base_dir_file_old_ext}"> <PatternLayout pattern="${log_pattern}" /> <Filters> <ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL" /> <ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/> </Filters> <Policies> <TimeBasedTriggeringPolicy/> <SizeBasedTriggeringPolicy size="${every_file_size}" /> </Policies> <DefaultRolloverStrategy max="20"/> </RollingFile> <RollingFile name="errorFile" fileName="${base_dir}${base_dir_error_file_name}${base_dir_file_ext}" filePattern="${base_dir}${base_dir_error_file_name}${base_dir_file_old_name}${base_dir_file_old_ext}"> <PatternLayout pattern="${log_pattern}" /> <Filters> <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/> </Filters> <Policies> <TimeBasedTriggeringPolicy/> <SizeBasedTriggeringPolicy size="${every_file_size}" /> </Policies> <DefaultRolloverStrategy max="20"/> </RollingFile> <RollingFile name="rollingFile" fileName="${base_dir}${base_dir_rolling_file_name}${base_dir_file_ext}" filePattern="${base_dir}${base_dir_rolling_file_name}${base_dir_file_old_name}${base_dir_file_old_ext}"> <PatternLayout pattern="${log_pattern}" /> <Policies> <TimeBasedTriggeringPolicy/> <SizeBasedTriggeringPolicy size="${every_file_size}" /> </Policies> <DefaultRolloverStrategy max="20"/> </RollingFile> <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用--> <!-- <File name="log" fileName="log/test.log" append="false"> <PatternLayout pattern="${log_pattern}"/> </File> --> <!-- 按分钟分 --> <!-- <RollingRandomAccessFile name="_1min_appender" fileName="${MINUTE_HOME}/minute" filePattern="${MINUTE_HOME}/minute-%d{yyyy-MM-dd-HH-mm}.log"> <PatternLayout pattern="%m%n"/> <Policies> <TimeBasedTriggeringPolicy interval="1" modulate="true" /> </Policies> </RollingRandomAccessFile> --> <!-- 发送邮件 --> <SMTP name="Mail" subject="${mail_subject}" from="${mail_from}" to="${mail_to}" replyTo="${mail_reply_to}" smtpProtocol="${mail_smtp_protocol}" smtpHost="${mail_smtp_host}" smtpPort="${mail_smtp_port}" smtpUsername="${mail_smtp_user_name}" smtpPassword="${mail_smtp_password}" smtpDebug="${mail_smtp_debug}" bufferSize="${mail_buffer_size}" cc="${mail_cc}"> </SMTP> </appenders> <loggers> <!-- 异步设置 --> <!-- 如果要加上位置信息比如哪个类,第几行,需要设置 includeLocation="true" --> <!-- 为Asynchronous Appenders 性能比同步快,比Asynchronous Loggers慢 --> <AsyncLogger name="AsyncMailLogger" level="ERROR" additivity="false" includeLocation="true"> <AppenderRef ref="Mail"/> </AsyncLogger> <AsyncLogger name="AsyncRollingLogger" level="All" additivity="false" includeLocation="true"> <AppenderRef ref="rollingFile"/> </AsyncLogger> <!-- Root level 是设置全局的信息显示级别 --> <!-- 级别排序: All < Trace < Debug < Info < Warn < Error < Fatal < OFF --> <Root level="All"> <AppenderRef ref="console"/> <AppenderRef ref="rollingFile"/> <AppenderRef ref="infoFile"/> <AppenderRef ref="warnFile"/> <AppenderRef ref="errorFile"/> <AppenderRef ref="Mail" level="Error"/> </Root> <!-- additivity="false" : 日志不再输出到控制台 --> <logger name="org.springframework" level="OFF" additivity="false"></logger> <logger name="org.apache.shiro" level="OFF" additivity="false"></logger> <logger name="org.apache.http" level="OFF" additivity="false"/> </loggers> </configuration> <!-- FailoverAppender 维护一个队列,系统将尝试向队列中的Appender依次输出LogEvent,直到有一个成功为止 官方:故障切换应用程序重复一组追加器。 如果主Appender失败,则二级追加器将按顺序尝试,直到一个成功或没有更多次要尝试 FileAppender 普通地输出到本地文件 官方:FileAppender 是一个OutputStreamAppender,用于写入fileName参数中指定的文件。 FileAppender使用FileManager(扩展OutputStreamManager)来实际执行文件I / O。 虽然不能共享来自不同配置的FileAppender,但如果管理器可访问,则FileManager可以是。 例如,servlet容器中的两个Web应用程序可以有自己的配置,并且如果Log4j在两个共同的ClassLoader中, 则可以安全地写入同一个文件 FlumeAppender 将几个不同源的日志汇集、集中到一处。 官方:这是在单独的jar中提供的可选组件。 是一个分布式,可靠和可用的系统,用于从大量不同的源有效地收集,聚合和移动大量日志数据到集中式数据存储。 FlumeAppender使用LogEvents并将其作为序列化Avro事件发送到Flume代理以供消费。 Flume Appender支持三种操作模式。 它可以充当远程Flume客户端,通过Avro将Flume事件发送到配置了Avro Source的Flume代理。 它可以充当嵌入式Flume代理,其中Flume事件直接传递到Flume进行处理。 它可以将事件持久化到本地BerkeleyDB数据存储,然后异步发送事件到Flume,类似于嵌入Flume代理,但没有大多数Flume依赖。 作为嵌入式代理的用法将导致消息被直接传递到Flume信道,然后控制将立即返回到应用程序。 所有与远程代理的交互都将异步进行。 将“type”属性设置为“嵌入”将强制使用嵌入式代理。 此外,在追加器配置中配置代理属性还将导致使用嵌入的代理。 JMSQueueAppender VS. JMSTopicAppender 与JMS相关的日志输出 RewriteAppender 对日志事件进行掩码或注入信息 RollingFileAppender 对日志文件进行封存(详细) RoutingAppender 在输出地之间进行筛选路由 SMTPAppender 将LogEvent发送到指定邮件列表 SocketAppender 将LogEvent以普通格式发送到远程主机 SyslogAppender 将LogEvent以RFC 5424格式发送到远程主机 AsynchAppender 将一个LogEvent异步地写入多个不同输出地 ConsoleAppender 将LogEvent输出到命令行(控制台) -->