GVKun编程网logo

Ozone执行命令出现ERROR,未找到Log4j2配置文件(log-level=info:未找到命令)

10

在这篇文章中,我们将带领您了解Ozone执行命令出现ERROR,未找到Log4j2配置文件的全貌,包括log-level=info:未找到命令的相关情况。同时,我们还将为您介绍有关api-log4j2

在这篇文章中,我们将带领您了解Ozone执行命令出现ERROR,未找到Log4j2配置文件的全貌,包括log-level=info:未找到命令的相关情况。同时,我们还将为您介绍有关api-log4j2配置、log4j1 如何平滑升级到log4j2呢、log4j2 properties配置文件参数详解、log4j2 配置文件的知识,以帮助您更好地理解这个主题。

本文目录一览:

Ozone执行命令出现ERROR,未找到Log4j2配置文件(log-level=info:未找到命令)

Ozone执行命令出现ERROR,未找到Log4j2配置文件(log-level=info:未找到命令)

报错

测试ozone命令执行报错,其实命令能正常执行,只是有个ERROR看着难受,ozone版本0.4.1

$ ozone sh key put /bdc/dlw/hosts-new /etc/hosts 
ERROR StatusLogger No Log4j 2 configuration file found. Using default configuration (logging only errors to the console), or user programmatically provided configurations. Set system property ''log4j2.debug'' to show Log4j 2 internal initialization logging. See https://logging.apache.org/log4j/2.x/manual/configuration.html for instructions on how to configure Log4j 2
2020-06-22 16:03:11,097 INFO impl.MetricsConfig: Loaded properties from hadoop-metrics2.properties
2020-06-22 16:03:11,118 INFO impl.MetricsSystemImpl: Scheduled Metric snapshot period at 10 second(s).
2020-06-22 16:03:11,118 INFO impl.MetricsSystemImpl: XceiverClientMetrics metrics system started

解决

提示没有Log4j2配置文件,去https://logging.apache.org/log4j/2.x/manual/configuration.html [1] 找了一份

$ cat log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="debug" strict="true" name="XMLConfigTest"
               packages="org.apache.logging.log4j.test">
  <Properties>
    <Property name="filename">target/test.log</Property>
  </Properties>
  <Filter type="ThresholdFilter" level="trace"/>
 
  <Appenders>
    <Appender type="Console" name="STDOUT">
      <Layout type="PatternLayout" pattern="%m MDC%X%n"/>
      <Filters>
        <Filter type="MarkerFilter" marker="FLOW" onMatch="DENY" onMismatch="NEUTRAL"/>
        <Filter type="MarkerFilter" marker="EXCEPTION" onMatch="DENY" onMismatch="ACCEPT"/>
      </Filters>
    </Appender>
    <Appender type="Console" name="FLOW">
      <Layout type="PatternLayout" pattern="%C{1}.%M %m %ex%n"/><!-- class and line number -->
      <Filters>
        <Filter type="MarkerFilter" marker="FLOW" onMatch="ACCEPT" onMismatch="NEUTRAL"/>
        <Filter type="MarkerFilter" marker="EXCEPTION" onMatch="ACCEPT" onMismatch="DENY"/>
      </Filters>
    </Appender>
    <Appender type="File" name="File" fileName="${filename}">
      <Layout type="PatternLayout">
        <Pattern>%d %p %C{1.} [%t] %m%n</Pattern>
      </Layout>
    </Appender>
  </Appenders>
 
  <Loggers>
    <Logger name="org.apache.logging.log4j.test1" level="debug" additivity="false">
      <Filter type="ThreadContextMapFilter">
        <KeyValuePair key="test" value="123"/>
      </Filter>
      <AppenderRef ref="STDOUT"/>
    </Logger>
 
    <Logger name="org.apache.logging.log4j.test2" level="debug" additivity="false">
      <AppenderRef ref="File"/>
    </Logger>
 
    <Root level="trace">
      <AppenderRef ref="STDOUT"/>
    </Root>
  </Loggers>
 
</Configuration>

再执行任务,没有提示报错,但是全是debug信息

$ ozone sh key put /bdc/dlw/hosts-new /etc/hosts
2020-06-22 16:06:04,414 main DEBUG Initializing configuration XmlConfiguration[location=/opt/dlw/core/ozone/etc/hadoop/log4j2.xml]
2020-06-22 16:06:04,420 main DEBUG Installed 1 script engine
2020-06-22 16:06:04,795 main DEBUG Oracle Nashorn version: 1.8.0_152, language: ECMAScript, threading: Not Thread Safe, compile: true, names: [nashorn, Nashorn, js, JS, JavaScript, javascript, ECMAScript, ecmascript], factory class: jdk.nashorn.api.scripting.NashornScriptEngineFactory
2020-06-22 16:06:04,798 main DEBUG Took 0.001686 seconds to load 0 plugins from package org.apache.logging.log4j.test
2020-06-22 16:06:04,798 main DEBUG PluginManager ''Core'' found 116 plugins
2020-06-22 16:06:04,798 main DEBUG PluginManager ''Level'' found 0 plugins
2020-06-22 16:06:04,808 main DEBUG Building Plugin[name=property, class=org.apache.logging.log4j.core.config.Property].
2020-06-22 16:06:04,820 main DEBUG PluginManager ''TypeConverter'' found 26 plugins
2020-06-22 16:06:04,828 main DEBUG createProperty(name="filename", value="target/test.log")
2020-06-22 16:06:04,829 main DEBUG Building Plugin[name=properties, class=org.apache.logging.log4j.core.config.PropertiesPlugin].
2020-06-22 16:06:04,834 main DEBUG configureSubstitutor(={filename=target/test.log}, Configuration(XMLConfigTest))
2020-06-22 16:06:04,835 main DEBUG PluginManager ''Lookup'' found 13 plugins
2020-06-22 16:06:04,836 main DEBUG Building Plugin[name=filter, class=org.apache.logging.log4j.core.filter.ThresholdFilter].
2020-06-22 16:06:04,839 main DEBUG createFilter(level="TRACE", onMatch="null", onMismatch="null")
2020-06-22 16:06:04,840 main DEBUG Building Plugin[name=layout, class=org.apache.logging.log4j.core.layout.PatternLayout].
2020-06-22 16:06:04,846 main DEBUG PatternLayout$Builder(pattern="%m MDC%X%n", PatternSelector=null, Configuration(XMLConfigTest), Replace=null, charset="null", alwaysWriteExceptions="null", disableAnsi="null", noConsoleNoAnsi="null", header="null", footer="null")
2020-06-22 16:06:04,846 main DEBUG PluginManager ''Converter'' found 44 plugins
2020-06-22 16:06:04,847 main DEBUG Building Plugin[name=filter, class=org.apache.logging.log4j.core.filter.MarkerFilter].
2020-06-22 16:06:04,849 main DEBUG createFilter(marker="FLOW", onMatch="DENY", onMismatch="NEUTRAL")
2020-06-22 16:06:04,850 main DEBUG Building Plugin[name=filter, class=org.apache.logging.log4j.core.filter.MarkerFilter].
2020-06-22 16:06:04,850 main DEBUG createFilter(marker="EXCEPTION", onMatch="DENY", onMismatch="ACCEPT")
2020-06-22 16:06:04,851 main DEBUG Building Plugin[name=filters, class=org.apache.logging.log4j.core.filter.CompositeFilter].
2020-06-22 16:06:04,852 main DEBUG createFilters(={FLOW, EXCEPTION})
2020-06-22 16:06:04,852 main DEBUG Building Plugin[name=appender, class=org.apache.logging.log4j.core.appender.ConsoleAppender].
2020-06-22 16:06:04,860 main DEBUG ConsoleAppender$Builder(target="null", follow="null", direct="null", bufferedIo="null", bufferSize="null", immediateFlush="null", ignoreExceptions="null", PatternLayout(%m MDC%X%n), name="STDOUT", Configuration(XMLConfigTest), Filters({FLOW, EXCEPTION}))
2020-06-22 16:06:04,863 main DEBUG Starting OutputStreamManager SYSTEM_OUT.false.false
2020-06-22 16:06:04,863 main DEBUG Building Plugin[name=layout, class=org.apache.logging.log4j.core.layout.PatternLayout].
2020-06-22 16:06:04,864 main DEBUG PatternLayout$Builder(pattern="%C{1}.%M %m %ex%n", PatternSelector=null, Configuration(XMLConfigTest), Replace=null, charset="null", alwaysWriteExceptions="null", disableAnsi="null", noConsoleNoAnsi="null", header="null", footer="null")
2020-06-22 16:06:04,865 main DEBUG Building Plugin[name=filter, class=org.apache.logging.log4j.core.filter.MarkerFilter].
2020-06-22 16:06:04,866 main DEBUG createFilter(marker="FLOW", onMatch="ACCEPT", onMismatch="NEUTRAL")
2020-06-22 16:06:04,866 main DEBUG Building Plugin[name=filter, class=org.apache.logging.log4j.core.filter.MarkerFilter].
2020-06-22 16:06:04,867 main DEBUG createFilter(marker="EXCEPTION", onMatch="ACCEPT", onMismatch="DENY")
2020-06-22 16:06:04,868 main DEBUG Building Plugin[name=filters, class=org.apache.logging.log4j.core.filter.CompositeFilter].
2020-06-22 16:06:04,868 main DEBUG createFilters(={FLOW, EXCEPTION})
2020-06-22 16:06:04,869 main DEBUG Building Plugin[name=appender, class=org.apache.logging.log4j.core.appender.ConsoleAppender].
2020-06-22 16:06:04,870 main DEBUG ConsoleAppender$Builder(target="null", follow="null", direct="null", bufferedIo="null", bufferSize="null", immediateFlush="null", ignoreExceptions="null", PatternLayout(%C{1}.%M %m %ex%n), name="FLOW", Configuration(XMLConfigTest), Filters({FLOW, EXCEPTION}))
2020-06-22 16:06:04,871 main DEBUG Building Plugin[name=layout, class=org.apache.logging.log4j.core.layout.PatternLayout].
2020-06-22 16:06:04,872 main DEBUG PatternLayout$Builder(pattern="%d %p %C{1.} [%t] %m%n", PatternSelector=null, Configuration(XMLConfigTest), Replace=null, charset="null", alwaysWriteExceptions="null", disableAnsi="null", noConsoleNoAnsi="null", header="null", footer="null")
2020-06-22 16:06:04,889 main DEBUG Building Plugin[name=appender, class=org.apache.logging.log4j.core.appender.FileAppender].
2020-06-22 16:06:04,892 main DEBUG FileAppender$Builder(fileName="target/test.log", append="null", locking="null", advertise="null", advertiseUri="null", createOnDemand="null", filePermissions="null", fileOwner="null", fileGroup="null", bufferedIo="null", bufferSize="null", immediateFlush="null", ignoreExceptions="null", PatternLayout(%d %p %C{1.} [%t] %m%n), name="File", Configuration(XMLConfigTest), Filter=null)
2020-06-22 16:06:04,895 main DEBUG Starting FileManager target/test.log
2020-06-22 16:06:04,895 main DEBUG Building Plugin[name=appenders, class=org.apache.logging.log4j.core.config.AppendersPlugin].
2020-06-22 16:06:04,896 main DEBUG createAppenders(={STDOUT, FLOW, File})
2020-06-22 16:06:04,897 main DEBUG Building Plugin[name=KeyValuePair, class=org.apache.logging.log4j.core.util.KeyValuePair].
2020-06-22 16:06:04,898 main DEBUG KeyValuePair$Builder(key="test", value="123")
2020-06-22 16:06:04,898 main DEBUG Building Plugin[name=filter, class=org.apache.logging.log4j.core.filter.ThreadContextMapFilter].
2020-06-22 16:06:04,900 main DEBUG createFilter(={test=123}, operator="null", onMatch="null", onMismatch="null")
2020-06-22 16:06:04,900 main DEBUG Building Plugin[name=AppenderRef, class=org.apache.logging.log4j.core.config.AppenderRef].
2020-06-22 16:06:04,901 main DEBUG createAppenderRef(ref="STDOUT", level="null", Filter=null)
2020-06-22 16:06:04,901 main DEBUG Building Plugin[name=logger, class=org.apache.logging.log4j.core.config.LoggerConfig].
2020-06-22 16:06:04,903 main DEBUG createLogger(additivity="false", level="DEBUG", name="org.apache.logging.log4j.test1", includeLocation="null", ={STDOUT}, ={}, Configuration(XMLConfigTest), ThreadContextMapFilter(isAnd=true, {test=[123]}))
2020-06-22 16:06:04,905 main DEBUG Building Plugin[name=AppenderRef, class=org.apache.logging.log4j.core.config.AppenderRef].
2020-06-22 16:06:04,906 main DEBUG createAppenderRef(ref="File", level="null", Filter=null)
2020-06-22 16:06:04,906 main DEBUG Building Plugin[name=logger, class=org.apache.logging.log4j.core.config.LoggerConfig].
2020-06-22 16:06:04,907 main DEBUG createLogger(additivity="false", level="DEBUG", name="org.apache.logging.log4j.test2", includeLocation="null", ={File}, ={}, Configuration(XMLConfigTest), Filter=null)
2020-06-22 16:06:04,908 main DEBUG Building Plugin[name=AppenderRef, class=org.apache.logging.log4j.core.config.AppenderRef].
2020-06-22 16:06:04,908 main DEBUG createAppenderRef(ref="STDOUT", level="null", Filter=null)
2020-06-22 16:06:04,909 main DEBUG Building Plugin[name=root, class=org.apache.logging.log4j.core.config.LoggerConfig$RootLogger].
2020-06-22 16:06:04,909 main DEBUG createLogger(additivity="null", level="TRACE", includeLocation="null", ={STDOUT}, ={}, Configuration(XMLConfigTest), Filter=null)
2020-06-22 16:06:04,910 main DEBUG Building Plugin[name=loggers, class=org.apache.logging.log4j.core.config.LoggersPlugin].
2020-06-22 16:06:04,911 main DEBUG createLoggers(={org.apache.logging.log4j.test1, org.apache.logging.log4j.test2, root})
2020-06-22 16:06:04,912 main DEBUG Configuration XmlConfiguration[location=/opt/dlw/core/ozone/etc/hadoop/log4j2.xml] initialized
2020-06-22 16:06:04,912 main DEBUG Starting configuration XmlConfiguration[location=/opt/dlw/core/ozone/etc/hadoop/log4j2.xml]
2020-06-22 16:06:04,913 main DEBUG Started configuration XmlConfiguration[location=/opt/dlw/core/ozone/etc/hadoop/log4j2.xml] OK.
2020-06-22 16:06:04,914 main DEBUG Shutting down OutputStreamManager SYSTEM_OUT.false.false-1
2020-06-22 16:06:04,914 main DEBUG Shut down OutputStreamManager SYSTEM_OUT.false.false-1, all resources released: true
2020-06-22 16:06:04,914 main DEBUG Appender DefaultConsole-1 stopped with status true
2020-06-22 16:06:04,915 main DEBUG Stopped org.apache.logging.log4j.core.config.DefaultConfiguration@384fc774 OK
2020-06-22 16:06:04,969 main DEBUG Registering MBean org.apache.logging.log4j2:type=5387f9e0
2020-06-22 16:06:04,972 main DEBUG Registering MBean org.apache.logging.log4j2:type=5387f9e0,component=StatusLogger
2020-06-22 16:06:04,974 main DEBUG Registering MBean org.apache.logging.log4j2:type=5387f9e0,component=ContextSelector
2020-06-22 16:06:04,975 main DEBUG Registering MBean org.apache.logging.log4j2:type=5387f9e0,component=Loggers,name=org.apache.logging.log4j.test1
2020-06-22 16:06:04,976 main DEBUG Registering MBean org.apache.logging.log4j2:type=5387f9e0,component=Loggers,name=
2020-06-22 16:06:04,976 main DEBUG Registering MBean org.apache.logging.log4j2:type=5387f9e0,component=Loggers,name=org.apache.logging.log4j.test2
2020-06-22 16:06:04,978 main DEBUG Registering MBean org.apache.logging.log4j2:type=5387f9e0,component=Appenders,name=STDOUT
2020-06-22 16:06:04,978 main DEBUG Registering MBean org.apache.logging.log4j2:type=5387f9e0,component=Appenders,name=File
2020-06-22 16:06:04,979 main DEBUG Registering MBean org.apache.logging.log4j2:type=5387f9e0,component=Appenders,name=FLOW
2020-06-22 16:06:04,982 main DEBUG org.apache.logging.log4j.core.util.SystemClock does not support precise timestamps.
2020-06-22 16:06:04,982 main DEBUG Reconfiguration complete for context[name=5387f9e0] at URI /opt/dlw/core/ozone/etc/hadoop/log4j2.xml (org.apache.logging.log4j.core.LoggerContext@3d36dff4) with optional ClassLoader: null
2020-06-22 16:06:04,983 main DEBUG Shutdown hook enabled. Registering a new one.
2020-06-22 16:06:04,984 main DEBUG LoggerContext[name=5387f9e0, org.apache.logging.log4j.core.LoggerContext@3d36dff4] started OK.
Loading configuration from the context classpath (hadoop-metrics2.properties) MDC{}
2020-06-22 16:06:05,014 main DEBUG AsyncLogger.ThreadNameStrategy=UNCACHED (user specified null, default is UNCACHED)
2020-06-22 16:06:05,014 main DEBUG org.apache.logging.log4j.core.util.SystemClock does not support precise timestamps.
2020-06-22 16:06:05,096 INFO impl.MetricsConfig: Loaded properties from hadoop-metrics2.properties
2020-06-22 16:06:05,114 INFO impl.MetricsSystemImpl: Scheduled Metric snapshot period at 10 second(s).
2020-06-22 16:06:05,114 INFO impl.MetricsSystemImpl: XceiverClientMetrics metrics system started

修改log4j2.xml文件,将其中的debug改为info,再执行命令

$ sed -i ''s/debug/info/g'' log4j2.xml
$ ozone sh key put /bdc/dlw/hosts-new /etc/hosts
Loading configuration from the context classpath (hadoop-metrics2.properties) MDC{}
2020-06-22 16:10:27,302 INFO impl.MetricsConfig: Loaded properties from hadoop-metrics2.properties
2020-06-22 16:10:27,323 INFO impl.MetricsSystemImpl: Scheduled Metric snapshot period at 10 second(s).
2020-06-22 16:10:27,323 INFO impl.MetricsSystemImpl: XceiverClientMetrics metrics system started

api-log4j2配置

api-log4j2配置

log4j2.xml

  log4j 2.x版本不再支持像1.x中的.properties后缀的文件配置方式,2.x版本配置文件后缀名只能为".xml",".json"或者".jsn"。
配置文件的格式:log2j配置文件可以是xml格式的,也可以是json格式的。
配置文件的位置:log4j2默认会在classpath目录下寻找log4j2.xml、log4j.json、log4j.jsn等名称的文件。
系统选择配置文件的优先级(从先到后)如下:
(1).classpath下的名为log4j2-test.json 或者log4j2-test.jsn的文件.
(2).classpath下的名为log4j2-test.xml的文件.
(3).classpath下名为log4j2.json 或者log4j2.jsn的文件.
(4).classpath下名为log4j2.xml的文件.
一般默认使用log4j2.xml进行命名。

配置文件节点

(1).根节点Configuration有两个属性:status和monitorinterval,有两个子节点:Appenders和Loggers(表明可以定义多个Appender和Logger)。
  status:指定log4j本身的打印日志的级别。
  monitorinterval:指定log4j自动重新配置的监测间隔时间,单位是s,最小是5s。
(2).Appenders节点,常见的有三种子节点:Console、RollingFile、File。Console节点用来定义输出到控制台的Appender。
  name:指定Appender的名字.
  target:SYSTEM_OUT 或 SYSTEM_ERR,一般只设置默认:SYSTEM_OUT。
  PatternLayout:输出格式,不设置默认为:%m%n。
File节点用来定义输出到指定位置的文件的Appender。
  name:指定Appender的名字。
  fileName:指定输出日志的目的文件带全路径的文件名。
  PatternLayout:输出格式,不设置默认为:%m%n。
RollingFile节点用来定义超过指定大小自动删除旧的创建新的的Appender。
  name:指定Appender的名字。
  fileName:指定输出日志的目的文件带全路径的文件名。
  PatternLayout:输出格式,不设置默认为:%m%n。
  filePattern:指定新建日志文件的名称格式。
  Policies:指定滚动日志的策略,就是什么时候进行新建日志文件输出日志。
  TimeBasedTriggeringPolicy:Policies子节点,基于时间的滚动策略,interval属性用来指定多久滚动一次,默认是1 hour。modulate=true用来调整时间:比如现在是早上3am,interval是4,那么第一次滚动是在4am,接着是8am,12am…而不是7am。
  SizeBasedTriggeringPolicy:Policies子节点,基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小。
  DefaultRolloverStrategy:用来指定同一个文件夹下最多有几个日志文件时开始删除最旧的,创建新的(通过max属性)。
ThresholdFilter属性:onMatch表示匹配设定的日志级别后是DENY还是ACCEPT,onMismatch表示不匹配设定的日志级别是DENY还是ACCEPT还是NEUTRAL。
(3).Loggers节点,常见的有两种:Root和Logger。
  Root节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出
  level:日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF。
  Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。
  level:日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF。
  name:用来指定该Logger所适用的类或者类所在的包全路径,继承自Root节点。
  AppenderRef:Logger的子节点,用来指定该日志输出到哪个Appender,如果没有指定,就会默认继承自Root.如果指定了,那么会在指定的这个Appender和Root的Appender中都会输出,此时我们可以设置Logger的additivity="false"只在自定义的Appender中进行输出。
(4).关于日志level.
  共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF。
  All:最低等级的,用于打开所有日志记录。
  Trace:是追踪,就是程序推进以下,你就可以写个trace输出,所以trace应该会特别多,不过没关系,我们可以设置最低日志级别不让他输出。
  Debug:指出细粒度信息事件对调试应用程序是非常有帮助的。
  Info:消息在粗粒度级别上突出强调应用程序的运行过程。
  Warn:输出警告及warn以下级别的日志。
  Error:输出错误信息日志。
  Fatal:输出每个严重的错误事件将会导致应用程序的退出的日志。
  OFF:最高等级的,用于关闭所有日志记录。
  程序会打印高于或等于所设置级别的日志,设置的日志等级越高,打印出来的日志就越少。

配置参数

%d{HH:mm:ss.SSS} 表示输出到毫秒的时间
%t 输出当前线程名称
%-5level 输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0
%logger 输出logger名称,因为Root Logger没有名称,所以没有输出
%msg 日志文本
%n 换行
其他常用的占位符有:
%F 输出所在的类文件名,如Log4j2Test.java
%L 输出行号
%M 输出所在方法名
%l 输出语句所在的行数, 包括类名、方法名、文件名、行数

Maven依赖

org.apache.logging.log4j
log4j-api
2.5

org.apache.logging.log4j
log4j-core
2.5

log4j1 如何平滑升级到log4j2呢

log4j1 如何平滑升级到log4j2呢

如题,log4j1 如何平滑升级到log4j2呢?  原来使用Logger.getLogger方法获取到org.apache.log4j.Logger对象的 ,现在LogManager.getLogger 方法获取到org.apache.logging.log4j.Logger 

log4j2 properties配置文件参数详解

log4j2 properties配置文件参数详解

# 这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,会看到log4j2内部各种详细输出
status = error

dest = err

name = PropertiesConfig

 
# 指定日志文件的位置和文件名称,以便记录多份日志时,直接引用
property.filename = target/rolling/rollingtest.log

 
# 级别过滤(过滤日志记录)
filter.threshold.type = ThresholdFilter
# 只记录debug级别以上的日志,大小写无关:(ALL<)TRACE<DEBUG<INFO<WARN<ERROR<FATAL(<OFF)
filter.threshold.level = debug


# 控制台类型的日志输出源
appender.console.type = Console
# 输出源的名称
appender.console.name = STDOUT
# 输出布局类型
appender.console.layout.type = PatternLayout
# 输出模板
appender.console.layout.pattern = %m%n
appender.console.filter.threshold.type = ThresholdFilter
appender.console.filter.threshold.level = error


# 文件滚动记录类型的日志输出源
appender.rolling.type = RollingFile
# 指定当前滚动输出源的名称
appender.rolling.name = RollingFile
# 指定当前日志文件的位置和文件名称,可以单独指定,也可以直接引用之前定义过得property.filename参数
appender.rolling.fileName = ${filename}
# 指定当发生Rolling时,文件的转移和重命名规则
appender.rolling.filePattern = target/rolling2/test1-%d{MM-dd-yy-HH-mm-ss}-%i.log.gz
# 滚动记录输出源布局类型
appender.rolling.layout.type = PatternLayout
# 滚动记录输出模板
appender.rolling.layout.pattern = %d %p %C{1.} [%t] %m%n
# 指定记录文件的封存策略,该策略主要是完成周期性的日志文件封存工作
appender.rolling.policies.type = Policies
# 基于时间的触发策略(TriggeringPolicy)
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
# 当前记录周期为每2秒生成一个文件,如果filePattern中配置的文件重命名规则是target/rolling2/test1-%d{yyyy-MM-dd HH-mm}-%i,最小的时间粒度是mm,即分钟,TimeBasedTriggeringPolicy指定的size是1,结合起来就是每2分钟生成一个新文件。如果改成%d{yyyy-MM-dd HH},最小粒度为小时,则每2个小时生成一个文件。
appender.rolling.policies.time.interval = 2
# 是否对封存时间进行调制。若modulate=true,则封存时间将以0点为边界进行偏移计算。比如,modulate=true,interval=4hours,那么假设上次封存日志的时间为03:00,则下次封存日志的时间为04:00,之后的封存时间依次为08:00,12:00,16:00
appender.rolling.policies.time.modulate = true
# 基于日志文件体积的触发策略。
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
# 当日志文件体积大于size指定的值时,触发Rolling
appender.rolling.policies.size.size=100MB
# 文件封存的覆盖策略(RolloverStrategy)
appender.rolling.strategy.type = DefaultRolloverStrategy
# 生成分割(封存)文件的个数,默认为5(-1,-2,-3,-4,-5)
appender.rolling.strategy.max = 5


# 记录器名称
logger.rolling.name = com.example.my.app
# 设置打印级别(日志级别)
logger.rolling.level = debug
# 是否向上级logger传递打印信息
logger.rolling.additivity = false
# 关联名称为RollingFile的输出源(appender)
logger.rolling.appenderRef.rolling.ref = RollingFile


# 根记录器,所有记录器的父辈
rootLogger.level = info
# 关联名称为STDOUT的输出源(appender)
rootLogger.appenderRef.stdout.ref = STDOUT

log4j2 配置文件

log4j2 配置文件

一、背景

  最近由于项目的需要,我们把log4j 1.x的版本全部迁移成log4j 2.x 的版本,那随之而来的slf4j整合log4j的配置以及log4j2配置文件的详解,就需要我们来好好聊一聊了。本文就专门来讲解下log4j2.xml配置文件的各项标签的意义。

二、配置全解

  1.关于配置文件的名称以及在项目中的存放位置

    log4j 2.x版本不再支持像1.x中的.properties后缀的文件配置方式,2.x版本配置文件后缀名只能为".xml",".json"或者".jsn".

    系统选择配置文件的优先级(从先到后)如下:

      (1).classpath下的名为log4j2-test.json 或者log4j2-test.jsn的文件.

      (2).classpath下的名为log4j2-test.xml的文件.

      (3).classpath下名为log4j2.json 或者log4j2.jsn的文件.

      (4).classpath下名为log4j2.xml的文件.

     我们一般默认使用log4j2.xml进行命名。如果本地要测试,可以把log4j2-test.xml放到classpath,而正式环境使用log4j2.xml,则在打包部署的时候不要打包log4j2-test.xml即可。

  2.缺省默认配置文件

  <?xml version="1.0" encoding="UTF-8"?>
  <Configuration status="WARN">
    <Appenders>
      <Console name="Console" target="SYSTEM_OUT">
        <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
      </Console>
    </Appenders>
    <Loggers>
      <Root level="error">
       <AppenderRef ref="Console"/>
     </Root>
   </Loggers>
 </Configuration>

  3.配置文件节点解析    

    (1).根节点Configuration有两个属性:status和monitorinterval,有两个子节点:Appenders和Loggers(表明可以定义多个Appender和Logger).

       status用来指定log4j本身的打印日志的级别.

       monitorinterval用于指定log4j自动重新配置的监测间隔时间,单位是s,最小是5s.

    (2).Appenders节点,常见的有三种子节点:Console、RollingFile、File.

       Console节点用来定义输出到控制台的Appender.

        name:指定Appender的名字.

        target:SYSTEM_OUT 或 SYSTEM_ERR,一般只设置默认:SYSTEM_OUT.

        PatternLayout:输出格式,不设置默认为:%m%n.

       File节点用来定义输出到指定位置的文件的Appender.

        name:指定Appender的名字.

        fileName:指定输出日志的目的文件带全路径的文件名.

        PatternLayout:输出格式,不设置默认为:%m%n.

       RollingFile节点用来定义超过指定大小自动删除旧的创建新的的Appender.

        name:指定Appender的名字.

        fileName:指定输出日志的目的文件带全路径的文件名.

        PatternLayout:输出格式,不设置默认为:%m%n.

        filePattern:指定新建日志文件的名称格式.

        Policies:指定滚动日志的策略,就是什么时候进行新建日志文件输出日志.

        TimeBasedTriggeringPolicy:Policies子节点,基于时间的滚动策略,interval属性用来指定多久滚动一次,默认是1 hour。modulate=true用来调整时间:比如现在是早上3am,interval是4,那么第一次滚动是在4am,接着是8am,12am...而不是7am.

        SizeBasedTriggeringPolicy:Policies子节点,基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小.

        DefaultRolloverStrategy:用来指定同一个文件夹下最多有几个日志文件时开始删除最旧的,创建新的(通过max属性)。

    (3).Loggers节点,常见的有两种:Root和Logger.

       Root节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出

         level:日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.

         AppenderRef:Root的子节点,用来指定该日志输出到哪个Appender.

       Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。

         level:日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.

         name:用来指定该Logger所适用的类或者类所在的包全路径,继承自Root节点.

         AppenderRef:Logger的子节点,用来指定该日志输出到哪个Appender,如果没有指定,就会默认继承自Root.如果指定了,那么会在指定的这个Appender和Root的Appender中都会输出,此时我们可以设置Logger的additivity="false"只在自定义的Appender中进行输出。

    (4).关于日志level.

      共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.

      All:最低等级的,用于打开所有日志记录.

      Trace:是追踪,就是程序推进以下,你就可以写个trace输出,所以trace应该会特别多,不过没关系,我们可以设置最低日志级别不让他输出.

      Debug:指出细粒度信息事件对调试应用程序是非常有帮助的.

      Info:消息在粗粒度级别上突出强调应用程序的运行过程.

      Warn:输出警告及warn以下级别的日志.

      Error:输出错误信息日志.

      Fatal:输出每个严重的错误事件将会导致应用程序的退出的日志.

      OFF:最高等级的,用于关闭所有日志记录.

      程序会打印高于或等于所设置级别的日志,设置的日志等级越高,打印出来的日志就越少

  4.比较完整的log4j2.xml配置模板

<?xml version="1.0" encoding="UTF-8"?>
  <!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
  <!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
  <!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
  <configuration status="WARN" monitorInterval="30">
      <!--先定义所有的appender-->
      <appenders>
      <!--这个输出控制台的配置-->
          <console name="Console" target="SYSTEM_OUT">
         <!--输出日志的格式-->
             <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
         </console>
     <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用-->
     <File name="log" fileName="log/test.log" append="false">
        <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
     </File>
     <!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
         <RollingFile name="RollingFileInfo" fileName="${sys:user.home}/logs/info.log"
                      filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
             <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->        
             <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
             <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
             <Policies>
                 <TimeBasedTriggeringPolicy/>
                 <SizeBasedTriggeringPolicy size="100 MB"/>
             </Policies>
         </RollingFile>
         <RollingFile name="RollingFileWarn" fileName="${sys:user.home}/logs/warn.log"
                      filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
             <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
             <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
             <Policies>
                 <TimeBasedTriggeringPolicy/>
                 <SizeBasedTriggeringPolicy size="100 MB"/>
             </Policies>
         <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
             <DefaultRolloverStrategy max="20"/>
         </RollingFile>
         <RollingFile name="RollingFileError" fileName="${sys:user.home}/logs/error.log"
                      filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
             <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
             <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
             <Policies>
                 <TimeBasedTriggeringPolicy/>
                 <SizeBasedTriggeringPolicy size="100 MB"/>
             </Policies>
         </RollingFile>
     </appenders>
     <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
     <loggers>
         <!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
         <logger name="org.springframework" level="INFO"></logger>
         <logger name="org.mybatis" level="INFO"></logger>
         <root level="all">
             <appender-ref ref="Console"/>
             <appender-ref ref="RollingFileInfo"/>
             <appender-ref ref="RollingFileWarn"/>
             <appender-ref ref="RollingFileError"/>
         </root>
     </loggers>
</configuration>

各种格式化说明如下:

  -X: X信息输出时左对齐

%logger 输出日志信息所属的类目,通常就是所在类的全名 
%-5level 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL,
%p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL, 
%d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921 
%r: 输出自应用启动到输出该log信息耗费的毫秒数 
%c: 输出日志信息所属的类目,通常就是所在类的全名 
%t: 输出产生该日志事件的线程名 
%l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。
    举例:Testlog4.main(TestLog4.java:10) 
%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。 
%%: 输出一个”%”字符 
%F: 输出日志消息产生时所在的文件名称 
%L: 输出代码中的行号 
%m: 输出代码中指定的消息,产生的日志具体信息 
%n: 输出一个回车换行符,Windows平台为”\r\n”,Unix平台为”\n”输出日志信息换行 
  
可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如: 
  1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。 
  2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,”-”号指定左对齐。 
  3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。 
  4)%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边交远销出的字符截掉。

   

今天关于Ozone执行命令出现ERROR,未找到Log4j2配置文件log-level=info:未找到命令的分享就到这里,希望大家有所收获,若想了解更多关于api-log4j2配置、log4j1 如何平滑升级到log4j2呢、log4j2 properties配置文件参数详解、log4j2 配置文件等相关知识,可以在本站进行查询。

本文标签: