012-log4j配置文件详解

1. 配置文件示例

下面展示一些 内联代码片

<?xml version="1.0" encoding="UTF-8"?>
<!-- ALL < TRACE< DEBUG < INFO < WARN < ERROR < FATAL < OFF -->
<!-- status: log4j本身的日志信息级别 -->
<Configuration status="OFF">
    <!-- 配置变量,可以在下面通过变量名进行引用 -->
    <Properties>
        <Property name="BaseDir">logs</Property>
        <Property name="LogName">info</Property>
        <Property name="LogExtensionName">gz</Property>
    </Properties>
    <Appenders>
        <!-- 日志写入文件 -->
        <RollingFile
                name="RollingFile"
                fileName="${BaseDir}/${LogName}.${LogExtensionName}"
                filePattern="${BaseDir}/$${date:yyyy-MM}/logs-%d{yyyy-MM-dd-HH}-%i.${LogExtensionName}.gz"
        >
            <!-- 日志信息格式 -->
            <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}] [%t] [%p] %c{1}.%M [%L] %m%n"/>
            <!-- 判断哪些级别的日志可以写入该文件 -->
            <Filters>
                <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <!-- 触发策略,决定何时触发文件的压缩, 满足下面任意一个条件都会触发压缩 -->
            <Policies>
                <!-- filePattern 中的最小粒度为单位, 每隔 interval 个单位时间压缩一次 -->
                <!-- 比如: yyyy-MM-dd-HH, 则每隔5个小时压缩一次 -->
                <TimeBasedTriggeringPolicy interval="5"/>
                <!-- 文件大小超过500MB时压缩日志文件 -->
                <SizeBasedTriggeringPolicy size="500MB"/>
            </Policies>
            <!--
                max参数是与filePattern中的计数器%i配合使用,根据filePattern的不同max的含义也不同
                1. 如果filePattern没有%i,则max不会生效
                2. 如果filePattern没有时间格式,有%i, 文件个数达到max, 则会删除旧的日志文件
                3. 如果filePattern有时间格式,有%i, 则时间格式相同时,文件个数达到max,则会删除旧的日志文件
                例如 %d{yyyy-MM-dd-HH}, 如果某个小时的文件个数大于max,则会删除这个小时内的旧的日志文件
            -->
            <DefaultRolloverStrategy max="7">
                <!-- 删除策略 -->
                <!-- maxDepth=2: 表示该策略会应用于BaseDir子目录下的日志文件 -->
                <Delete basePath="${BaseDir}" maxDepth="2">
                    <!-- 下面的文件名策略,文件最新的修改时间策略,文件大小策略,文件个数策略都可以进行组合使用 -->
                    <!-- IfAny 表示或, IfAll 表示与 -->
                    <!-- 如果filePattern中包含时间格式,则IfFileName策略会按照时间格式维度进行判断 -->
                    <!--
                        例如时间格式为%d{yyyy-MM-dd-HH},以2022-10-01-12的文件为例
                        info-2022-10-10-12-1.log.gz
                        info-2022-10-10-12-2.log.gz
                        info-2022-10-10-12-3.log.gz
                        info-2022-10-10-12-4.log.gz
                        1. 将2022-10-01-12的所有文件进行一次逻辑判断
                        2. 如果文件都超过30天未修改
                        3. 满足下面两个任意一个条件即可删除
                        3.1 2022-10-01-12文件总大小大于5GB
                        3.2 2022-10-01-12文件总个数大于3个
                    -->
                    <IfFileName glob="*/${LogName}-*.${LogExtensionName}.gz">
                        <IfLastModified age="30d">
                            <IfAny>
                                <IfAccumulatedFileSize exceeds="5GB"/>
                                <IfAccumulatedFileCount exceeds="3"/>
                            </IfAny>
                        </IfLastModified>
                    </IfFileName>
                </Delete>
                <!-- maxDepth=1: 表示该策略会应用于BaseDir目录下的日志文件 -->
                <Delete basePath="${BaseDir}" maxDepth="1">
                    <IfLastModified age="10d" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>
 
        <!-- 输出到控制台的日志信息 -->
        <Console name="console" target="SYSTEM_OUT">
            <ThresholdFilter level="INFO"/>
            <PatternLayout pattern="[%d{yyyy-MM-dd-HH:mm:ss}] [%-15t] [%-5p] - %-35C{1} %M - %m%n"/>
        </Console>
    </Appenders>
 
    <Loggers>
        <Root level="INFO">
            <AppenderRef ref="RollingFile"/>
            <AppenderRef ref="console"/>
        </Root>
    </Loggers>
</Configuration>

#展示log4j各种配置,私有部分见文件中注释,公有部分详细注释见文件最后
log4j.rootLogger=DEBUG,console,file,rolling,daily,DATABASE,MAIL

#控制台
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} - [%p] - [%l] %m%n

#普通文件
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.Encoding=UTF-8
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} - [%p] - [%l] %m%n
log4j.appender.file.File=../logs/file.log
log4j.appender.file.Append=true
log4j.appender.rolling.Threshold=DEBUG 

#轮转文件
log4j.appender.rolling=org.apache.log4j.RollingFileAppender
log4j.appender.rolling.layout=org.apache.log4j.PatternLayout
log4j.appender.rolling.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} - [%p] - [%l] %m%n
log4j.appender.rolling.Append=true
log4j.appender.rolling.Encoding=UTF-8
log4j.appender.rolling.Threshold=DEBUG
#表示最多保存10个日志文件
log4j.appender.rolling.MaxBackupIndex=10
log4j.appender.rolling.File=../logs/rolling.log
log4j.appender.rolling.MaxFileSize=10MB

#按日期区分
log4j.appender.daily=org.apache.log4j.DailyRollingFileAppender
log4j.appender.daily.layout=org.apache.log4j.PatternLayout
log4j.appender.daily.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} - [%p] - [%l] %m%n
log4j.appender.daily.Append=true
log4j.appender.daily.Encoding=UTF-8
log4j.appender.daily.Threshold=DEBUG
log4j.appender.daily.File=../logs/daily.log
# 表示重开文件的频率
# yyyy-MM,对应monthly(每月)
# yyyy-ww,对应weekly(每周)
# yyyy-MM-dd,对应daily(每天)
# yyyy-MM-dd-a,对应half-daily(每半天)
# yyyy-MM-dd-HH,对应hourly(每小时)
# yyyy-MM-dd-HH-mm,对应minutely(每分钟)
# 不用处理的文字放在单引号之间
log4j.appender.daily.DatePattern='.'yyyy-MM-dd'.log'

#写入数据库
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test
log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
log4j.appender.DATABASE.user=root
log4j.appender.DATABASE.password=root
log4j.appender.DATABASE.sql=INSERT INTO test (text) VALUES ('%d{yyyy-MM-dd HH:mm:ss} - [%p] - [%l] %m%n')
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} - [%p] - [%l] %m%n

#发送邮件
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold=ERROR
log4j.appender.MAIL.From=7610aotian@sina.com
log4j.appender.MAIL.SMTPHost=smtp.sina.com
log4j.appender.MAIL.Subject=Log4J Message
log4j.appender.MAIL.To=7610aotian@sina.com
#发件箱登陆用户名
log4j.appender.MAIL.SMTPUsername=******
#发件箱登陆密码
log4j.appender.MAIL.SMTPPassword=******
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} - [%p] - [%l] %m%n

# 定义输出级别和输出端(A1,A2,A3....)
# DEBUG: 指出细粒度信息事件对调试应用程序是非常有帮助的,就是输出debug的信息.
# INFO: 表明消息在粗粒度级别上突出强调应用程序的运行过程,就是输出提示信息.
# WARN: 表明会出现潜在错误的情形,就是显示警告信息.
# ERROR: 指出虽然发生错误事件,但仍然不影响系统的继续运行.就是显示错误信息.
# FATAL: 指出每个严重的错误事件将会导致应用程序的退出.
# ALL: 是最低等级的,用于打开所有日志记录.
# OFF: 是最高等级的,用于关闭所有日志记录.
# log4j建议只使用五个级别,级别顺序(由低到高): DEBUG < INFO < WARN < ERROR < FATAL
# windows下控制台效率比较差,输出的多了,非常影响服务器性能.
# 调试程序用debug或更低的优先级,这样开发的时候可以尽量输出,方便调试.
# 正式部署之后,可以提高日志的级别,只输出关键信息
log4j.rootLogger=DEBUG,*,*,*,*......

# 定义A1输出到控制器
# ConsoleAppender:写到控制台
# FileAppender:写到指定的文件中
# DailyRollingFileAppender:把Log信息输出到按照日期来区分的文件中,每天产生一个log文件
# RollingFileAppender:文件大小到达指定尺寸的时候产生一个新的文件
# WriterAppender:将日志信息以流格式发送到任意指定的地方(需要配合代码进行,不常用)
# JDBCAppender:输出日志文件到数据库
# SMTPAppender:发送到指定邮箱
log4j.appender.*=org.apache.log4j.ConsoleAppender

# 定义A1的布局模式
# HTMLLayout:HTML表格形式布局
# PatternLayout:可以灵活地指定布局模式,就是可以自定义输出样式
# SimpleLayout:包含日志信息的级别和信息字符串
# TTCCLayout:包含日志产生的时间、线程、类别等等信息
log4j.appender.*.layout=org.apache.log4j.PatternLayout

# 定义A1的输出格式
# %m 输出代码中指定的消息 
# %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL 
# %r 输出自应用启动到输出该log信息耗费的毫秒数 
# %t 输出产生该日志事件的线程名; 
# %n 输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n" 
# %d 输出日志时间的日期或时间,默认格式为ISO8601,也可以在其后指定格式
# %c 输出所属的类目,通常就是所在类的全名,如“iNotes.Default”; 
# %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数 
# %L 输出代码中的行数; 
# %F 输出代码中的文件名; 
log4j.appender.*.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} - [%p] - [%l] %m%n

2. 注意事项

1.PatternLayout

    1. 模式字符含义
   %d: 日志产生时间
   %t: thread id当前线程ID
   %p: priority日志优先级(DEBUG、INFO、WARN……)
   %F: 日志所在文件名
   %c: logger的名称
   %C: 日志请求的完全限定类名(例如类名为com.skd.demo.App, %C{1} 会输出App)
   %M: 日志所在方法名
   %L: 日志语句所在的行号
   %m: 日志内容
   %n: 换行符

    1. 格式修饰符
       以%M为例:
       %20M: 右对齐,如果方法名长度小于20个字符,则用空格在左边补齐
      %-20M: 左对齐,如果方法名长度小于20个字符,则用空格在右边补齐
      %.20M: 左对齐,如果方法名长度大于20个字符,则保留右边的20个字符
    %20.30M: 右对齐,如果方法名长度小于20个字符,则用空格在左边补齐; 如果长度大于30,则保留右边的30个字符
   %-20.30M: 左对齐,如果方法名长度小于20个字符,则用空格在右边补齐; 如果长度大于30,则保留左边的30个字符

  1. ThresholdFilter
   onMatch="ACCEPT" 表示匹配该级别及以上
   onMatch="DENY" 表示不匹配该级别及以上
   onMatch="NEUTRAL" 表示该级别及以上的,由下一个filter处理,如果当前是最后一个,则表示匹配该级别及以上
   onMismatch="ACCEPT" 表示匹配该级别以下
   onMismatch="NEUTRAL" 表示该级别及以下的,由下一个filter处理,如果当前是最后一个,则不匹配该级别以下的
   onMismatch="DENY" 表示不匹配该级别以下的

配置的其他说明

  1. 输出方式appender一般有5种:
    org.apache.log4j.RollingFileAppender(滚动文件,自动记录最新日志)
    org.apache.log4j.ConsoleAppender (控制台)
    org.apache.log4j.FileAppender (文件)
    org.apache.log4j.DailyRollingFileAppender (每天产生一个日志文件)
    org.apache.log4j.WriterAppender (将日志信息以流格式发送到任意指定的地方)

  2. 日记记录的优先级priority,优先级由高到低分为
    OFF ,FATAL ,ERROR ,WARN ,INFO ,DEBUG ,ALL。
    Log4j建议只使用FATAL ,ERROR ,WARN ,INFO ,DEBUG这五个级别。

  3. 格式说明layout中的参数都以%开始,后面不同的参数代表不同的格式化信息(参数按字母表顺序列出):
    %c 输出所属类的全名,可在修改为 %d{Num} ,Num类名输出的维(如:“org.apache.elathen.ClassName”,%C{2}将输出elathen.ClassName)
    %d 输出日志时间其格式为 %d{yyyy-MM-dd HH:mm:ss,SSS},可指定格式 如 %d{HH:mm:ss}
    %l 输出日志事件发生位置,包括类目名、发生线程,在代码中的行数
    %n 换行符
    %m 输出代码指定信息,如info(“message”),输出message
    %p 输出优先级,即 FATAL ,ERROR 等
    %r 输出从启动到显示该log信息所耗费的毫秒数
    %t 输出产生该日志事件的线程名

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孤独的深山老人

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值