• Logback configuration


    官方指导

     http://logback.qos.ch/manual/configuration.html

    规则

    ch.qos.logback.core.joran.JoranConfiguratorBase.java (位于 core)

        @Override
        protected void addInstanceRules(RuleStore rs) {
    
            // is "configuration/variable" referenced in the docs?
            rs.addRule(new ElementSelector("configuration/variable"), new PropertyAction());
            rs.addRule(new ElementSelector("configuration/property"), new PropertyAction());
    
            rs.addRule(new ElementSelector("configuration/substitutionProperty"), new PropertyAction());
    
            rs.addRule(new ElementSelector("configuration/timestamp"), new TimestampAction());
            rs.addRule(new ElementSelector("configuration/shutdownHook"), new ShutdownHookAction());
            rs.addRule(new ElementSelector("configuration/define"), new DefinePropertyAction());
    
            // the contextProperty pattern is deprecated. It is undocumented
            // and will be dropped in future versions of logback
            rs.addRule(new ElementSelector("configuration/contextProperty"), new ContextPropertyAction());
    
            rs.addRule(new ElementSelector("configuration/conversionRule"), new ConversionRuleAction());
    
            rs.addRule(new ElementSelector("configuration/statusListener"), new StatusListenerAction());
    
            rs.addRule(new ElementSelector("configuration/appender"), new AppenderAction<E>());
            rs.addRule(new ElementSelector("configuration/appender/appender-ref"), new AppenderRefAction<E>());
            rs.addRule(new ElementSelector("configuration/newRule"), new NewRuleAction());
            rs.addRule(new ElementSelector("*/param"), new ParamAction(getBeanDescriptionCache()));
        }

    ch.qos.logback.classic.joran.JoranConfigurator.java (位于classic)

     @Override
        public void addInstanceRules(RuleStore rs) {
            // parent rules already added
            super.addInstanceRules(rs);
    
            rs.addRule(new ElementSelector("configuration"), new ConfigurationAction());
    
            rs.addRule(new ElementSelector("configuration/contextName"), new ContextNameAction());
            rs.addRule(new ElementSelector("configuration/contextListener"), new LoggerContextListenerAction());
            rs.addRule(new ElementSelector("configuration/insertFromJNDI"), new InsertFromJNDIAction());
            rs.addRule(new ElementSelector("configuration/evaluator"), new EvaluatorAction());
    
            rs.addRule(new ElementSelector("configuration/appender/sift"), new SiftAction());
            rs.addRule(new ElementSelector("configuration/appender/sift/*"), new NOPAction());
    
            rs.addRule(new ElementSelector("configuration/logger"), new LoggerAction());
            rs.addRule(new ElementSelector("configuration/logger/level"), new LevelAction());
    
            rs.addRule(new ElementSelector("configuration/root"), new RootLoggerAction());
            rs.addRule(new ElementSelector("configuration/root/level"), new LevelAction());
            rs.addRule(new ElementSelector("configuration/logger/appender-ref"), new AppenderRefAction<ILoggingEvent>());
            rs.addRule(new ElementSelector("configuration/root/appender-ref"), new AppenderRefAction<ILoggingEvent>());
    
            // add if-then-else support
            rs.addRule(new ElementSelector("*/if"), new IfAction());
            rs.addRule(new ElementSelector("*/if/then"), new ThenAction());
            rs.addRule(new ElementSelector("*/if/then/*"), new NOPAction());
            rs.addRule(new ElementSelector("*/if/else"), new ElseAction());
            rs.addRule(new ElementSelector("*/if/else/*"), new NOPAction());
    
            // add jmxConfigurator only if we have JMX available.
            // If running under JDK 1.4 (retrotranslateed logback) then we
            // might not have JMX.
            if (PlatformInfo.hasJMXObjectName()) {
                rs.addRule(new ElementSelector("configuration/jmxConfigurator"), new JMXConfiguratorAction());
            }
            rs.addRule(new ElementSelector("configuration/include"), new IncludeAction());
    
            rs.addRule(new ElementSelector("configuration/consolePlugin"), new ConsolePluginAction());
    
            rs.addRule(new ElementSelector("configuration/receiver"), new ReceiverAction());
    
        }

    具体属性规则可进入对应的Action 查看

    比如:

    public class ConfigurationAction extends Action {
        static final String INTERNAL_DEBUG_ATTR = "debug";
        static final String PACKAGING_DATA_ATTR = "packagingData";
        static final String SCAN_ATTR = "scan";
        static final String SCAN_PERIOD_ATTR = "scanPeriod";
        static final String DEBUG_SYSTEM_PROPERTY_KEY = "logback.debug";
    ...

    配置文件

    1.清单

    logback.groovy

    logback-test.xml

    logback.xml

    2.优先级

    1. Logback tries to find a file called logback.groovy in the classpath.

    2. If no such file is found, logback tries to find a file called logback-test.xml in the classpath.

    3. If no such file is found, it checks for the file logback.xml in the classpath..

    4. If no such file is found, and the executing JVM has the ServiceLoader (JDK 6 and above) the ServiceLoader will be used to resolve an implementation of com.qos.logback.classic.spi.Configurator. The first implementation found will be used. See ServiceLoader documentation for more details.

    5. If none of the above succeeds, logback configures itself automatically using theBasicConfigurator which will cause logging output to be directed to the console.

    3.备注

    .groovy 是一种基于JVM(Java虚拟机)的敏捷开发语言,文件格式不同于xml

    in the classpath 具体是哪里?directly under WEB-INF/classes/    or      classes/

    第4项什么意思

    第5项什么意思?等价于 logback-test.xml

    <configuration>
    
      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- encoders are assigned the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
        <encoder>
          <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
      </appender>
    
      <root level="debug">
        <appender-ref ref="STDOUT" />
      </root>
    </configuration>

    <configuration

     

    1. debug="true"(配置文件中)

    <configuration debug="true">

     或者等价方式(java文件中)

            LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
            // print logback's internal status
            StatusPrinter.print(lc);

    打印如下:

    16:24:00,500 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
    16:24:00,500 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
    16:24:00,500 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.xml]
    16:24:00,500 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Setting up default configuration.

    有时候是这样:

    16:38:19,515 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
    16:38:19,515 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback-test.xml] at [file:/E:/e/workspace/simple-logback/target/classes/logback-test.xml]
    16:38:19,625 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
    16:38:19,625 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [STDOUT]
    16:38:19,656 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
    16:38:19,687 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to DEBUG
    16:38:19,687 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [STDOUT] to Logger[ROOT]
    16:38:19,687 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
    16:38:19,687 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@132b73b - Registering current configuration as safe fallback point

    2. scan="true"

    不指定单位时是毫秒,默认1分钟

    <configuration scan="true" scanPeriod="30 seconds" >

    修改logback.xml 文件之后,会监听配置文件的改动,30秒一次,如果监听到做了改动,则会使用最新的

    变量

    1.范围

    LOCAL CONTEXT SYSTEM OS
    作用于一个配置文件
    作用于一个app(整个项目)
    作用于多个app(整个JVM)
    作用于操作系统

    举例:
    <property scope="context" name="nodeId" value="firstNode" />
    scope允许的值有local、context、system ,默认是local

    2.使用

    a.引入properties文件,然后${some_properties_key}

    Example: Variable file (logback-examples/src/main/java/chapters/configuration/variables1.properties)

    USER_HOME=/home/sebastien

    引入方式有两种:文件和资源

    <configuration>
      <property file="src/main/java/chapters/configuration/variables1.properties" />
    </configuration>
    <property resource="variables1.properties" />

    b.定义到配置文件,然后${some_custom_key}

    <property scope="context" name="nodeId" value="firstNode" />

    c.直接使用${some_context_key}

    重要属性

    ${HOSTNAME} 主机名

    ${CONTEXT_NAME} 上下文名, 默认值是default,可通过<contextName>yourname</contextName>设置

    举例说明

    配置发邮件的appender

    <contextName>${app.context.name.en}</contextName>
    ...//省略部分代码
    <subject>${CONTEXT_NAME} - ${HOSTNAME}</subject>

    收到邮件后就是如下效果

    意思是:位于adapp18号机器的mmsi项目发来错误日志邮件。

    d.直接使用${some_system_key}

    System.getProperties()

    常用的有:

    file.separator=

    catalina.base=E:eworkspace.metadata.pluginsorg.eclipse.wst.server.core mp0

    user.home=C:Documents and SettingsAdministrator

    设置日志文件路径时经常用到。

     设置拦截级别

     

  • 相关阅读:
    线程同步 –Mutex和Semaphore
    线程同步 –AutoResetEvent和ManualResetEvent
    线程同步 – lock和Monitor
    .NET垃圾回收 – 非托管资源
    .NET垃圾回收 – 原理浅析
    反射简介—C#特性和反射
    反射简介—类型反射和晚期绑定
    Django REST framework 第一章 Serialization
    Django REST framework 简介
    Python Django 实用小案例2
  • 原文地址:https://www.cnblogs.com/zno2/p/4792215.html
Copyright © 2020-2023  润新知