logback

http://www.importnew.com/22290.html

http://www.cnblogs.com/warking/p/5710303.html

logback使用

一、logback的介绍

Logback是由log4j创始人设计的另一个开源日志组件,官方网站: http://logback.qos.ch

它当前分为下面下个模块:
​   logback-core:其它两个模块的基础模块
​   logback-classic:它是log4j的一个改良版本,同时它完整实现了slf4j API,使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging
​   logback-access:是为了集成Servlet环境而准备的,可提供HTTP-access的日志接口

二、LogBack、Slf4j和Log4j之间的关系

SLF4J(Simple logging Facade for Java)不是一个真正的日志实现,而是一个抽象层,SLF4J使你的代码独立于任意一个特定的日志API。一般常配合Log4j,LogBack,java.util.logging使用。Slf4j作为应用层的Log接入时,程序可以根据实际应用场景动态调整底层的日志实现框架(Log4j/LogBack/JdkLog…)。LogBack和Log4j都是开源日记工具库,LogBack是Log4j的改良版本,比Log4j拥有更多的特性,同时也带来很大性能提升。LogBack官方建议配合Slf4j使用,这样可以灵活地替换底层日志框架。

三、logback的体系结构

Logger、Appender和 Layout

Logger:作为日志的记录器,把它关联到应用的对应的context上后,主要用于存放日志对象,也可以定义日志类型、级别,Logger类是logback-classic模块的一部分。
Appender:主要用于指定日志输出的目的地,目的地可以是控制台、文件、远程套接字服务器、数据库、 JMS和远程UNIX Syslog守护进程等。 Appender来自logback-core
Layout:负责把事件转换成字符串,格式化的日志信息的输出。Layout类来自logback-core

1、Logger 上下文

​ Logger 是命名了的实体。它们的名字大小写敏感且遵从下面的层次化的命名规则:

如果 logger的名称带上一个点号后是另外一个 logger的名称的前缀,那么,前者就被称为后者的祖先。如果 logger与其后代 logger之间没有其他祖先,那么,前者就被称为子logger 之父。 根 logger 位于 logger 等级的最顶端,它是每个层次等级的共同始祖。

获取根ROOT

Logger rootLogger = LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);

所有logger通过org.slf4j.LoggerFactory 类的静态方法getLogger取得。 getLogger方法以 logger 名称为参数。

2、有效级别及级别的继承

​ Logger 可以被分配级别。级别包括:TRACE、DEBUG、INFO、WARN 和 ERROR,定义于ch.qos.logback.classic.Level类。如果 logger没有被分配级别,那么它将从有被分配级别的最近的祖先那里继承级别。root logger 默认级别是 DEBUG。

3、打印方法与基本的选择规则

​ 打印方法决定记录请求的级别。例如,如果 L 是一个 logger 实例,那么,语句L.info(“..”)是一条级别为 INFO的记录语句。记录请求的级别在高于或等于其 logger 的有效级别时被称为被启用,否则,称为被禁用。记录请求级别为 p,其 logger的有效级别为 q,只有则当 p>=q时,该请求才会被执行。该规则是 logback 的核心。级别排序为: TRACE < DEBUG < INFO < WARN < ERROR

4、Appender和 Layout

​ Appender叠加性

Logger L的记录语句的输出会发送给 L及其祖先的全部 appender,然而如果 logger L的某个祖先 P设置叠加性标识为 false,那么,L的输出会发送给L 与 P之间(含P)的所有 appender,但不会发送给P的任何祖先的appender。Logger 的叠加性默认为 true

四、logback配置

1、Logback 查找配置文件顺序

​ logback-test.xml=>logback.groovy=>logback.xml。如果都不存在,那么 logback 默认地会调用BasicConfigurator ,创建一个最小化配置。

public class BaseTest {
    @Test
    public void test(){
        Logger logger = LoggerFactory.getLogger("com.test.LogTest");
        logger.info("xxxxxx");

        LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
        StatusPrinter.print(context);
    }
}

BasicConfigurator 配置等效

<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>

2、执行logback配置文件路径

​ logback也可以通过系统属性对默认配置文件的位置进行指定。属性值即配置文件位置可以是个 URL、classpath 里的一个资源,或者是程序外部的文件路径。文件扩展名必须为“.xml”或“.groovy”

java -Dlogback.configurationFile=/path/to/config.xml chapters.configuration.MyApp1

3、配置文件修改后自动重新加载

<configuration scan="true"> 
... 
</configuration> 

​ 默认情况下,每隔一分钟扫描一次。 configuration 元素的 scanPeriod 属性控制扫描周期,其值可以带时间单位,包括:milliseconds、seconds、minutes 和 hours。

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

​ 如果没写明时间单位,则默认为毫秒。

4、logback日志servlet

​ Logback-classic 带了一个叫 ViewStatusMessagesServlet 的 Servlet,它以 HTML表格的格式打印与当前 LoggerContext 关联的 StatusManager 的内容。要加到自己的 web 应用程序里,可以在 WEB-INF/web.xml里添加如下内容:

<servlet> 
  <servlet-name>ViewStatusMessages</servlet-name> 
  <servlet-class>ch.qos.logback.classic.ViewStatusMessagesServlet</
servlet-class> 
</servlet> 

<servlet-mapping> 
  <servlet-name>ViewStatusMessages</servlet-name> 
  <url-pattern>/lbClassicStatus</url-pattern> 
</servlet-mapping> 

5、配置文件语法

​ Logback 配置文件的语法非常灵活。正因为灵活,所以无法用DTD 或XML schema 进行定义。

基本结构以开头,后面有零 个或多个元素,有零个或多个元素,有最多一个元素。

5.1配置 logger

根节点

属性类型描述
scanboolean当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true
scanPeriodstring扫描周期,当scan为true时,此属性生效。默认情况下,每隔一分钟扫描一次。其值可以带时间单位,包括:milliseconds、seconds、minutes 和 hours。如果没写明时间单位,则默认为毫秒
debugboolean当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false

节点

​ 每个logger都关联到logger上下文,默认上下文名称为default。但可以使用设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改

<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <contextName>myAppName</contextName>
  ......
</configuration> 

节点

​ 用来定义变量值,它有两个属性name和value,通过定义的值会被插入到logger上下文中,可以使“${}”来引用变量。

<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <property name="APP_Name" value="myAppName" />
    ......
</configuration>

指定文件

<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <property file="src/main/java/chapters/configuration/variables1.properties" /> 
  ......
</configuration> 

引用 class path 上的资源

<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <property resource="resource1.properties" /> 
  ......
</configuration> 

变量的默认替换值

在某些特定情况下,最好给变量一个默认值,以免变量未被声明或值为 null。用“:-”指定默认值

${aKey:-golden}将被解释为“golden”

HOSTNNAME 属性

HOSTNNAME 属性因为很常用,所以在配置过程中被自动定义

在运行中定义属性

可以配置文件里用元素定义属性。 元素有两个必要属性: name 和 class。name 属性代表属性的名称, class 属性代表 PropertyDefiner 接口的任意实现。 PropertyDefiner接口的 getPropertyValue()方法返回的值就是属性值。

<configuration> 
  <define name="rootLevel" 
class="a.class.implementing.PropertyDefiner"> 
    <aProperty>of a.class.implementing.PropertyDefiner</aProperty> 
  </define> 
  <root level="${rootLevel}" /> 
</configuration> 
**配置文件里的条件化处理** 

开发者经常需要针对不同的环境在不同的配置文件里换来换去,比如开发、测试和生产环境。这些配置文件大同小异。为避免重复劳动,logback 支持在配置文件里进行条件化处理,用、和这些元素可以让一个配置文件适用于多个环境。

<configuration> 
  <!-- if-then form --> 
  <if condition="some conditional expression"> 
    <then> 
      ... 
    </then> 
  </if> 

  <!-- if-then-else form --> 
  <if condition="some conditional expression"> 
    <then> 
      ... 
    </then> 
    <else> 
      ...
    </else> 
  </if> 
</configuration> 

其中“condition”是 java 表达式,只允许访问上下文属性和系统属性。对于作为参数传入的键,property()方法或其等价的 p()方法将返回属性的字符串值。

例如,想访问属性键为“k”的值,你可以用 property(“k”)或等价的 p(“k”)。如果键为“k”的属性未被定义,property
方法将返回空字符串而不是 null,这样避免了检查 null值

<configuration> 
  <if condition='property("HOSTNAME").contains("torino")'> 
    <then> 
      <appender name="CON" class="ch.qos.logback.core.ConsoleAppender"> 
        <encoder> 
          <pattern>%d %-5level %logger{35} - %msg %n</pattern> 
        </encoder> 
      </appender> 
      <root> 
        <appender-ref ref="CON" /> 
      </root> 
    </then> 
  </if> 
  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
  <file>${randomOutputDir}/conditional.log</file> 
  <encoder> 
    <pattern>%d %-5level %logger{35} - %msg %n</pattern> 
  </encoder> 
</appender> 
<root level="ERROR"> 
  <appender-ref ref="FILE" /> 
</root> 
/configuration> 

文件包含

Joran 支持在配置文件里包含其他文件。方法是声明元素

<configuration> 
  <include file="src/main/java/chapters/configuration/includedConfig.xml" /> 
  <root level="DEBUG"> 
    <appender-ref ref="includedConsole" /> 
  </root>
</configuration> 

被包含的文件必须把它的元素嵌套在元素里

<included> 
  <appender name="includedConsole" 
class="ch.qos.logback.core.ConsoleAppender"> 
    <encoder> 
      <pattern>"%d - %m%n"</pattern> 
    </encoder> 
  </appender> 
</included> 

节点

​ 获取时间戳字符串,他有两个属性key和datePattern

​ key: 标识此 的名字;
​ datePattern: 设置将当前时间(解析配置文件的时间)转换为字符串的模式,SimpleDateFormat的格式

<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/>
    <contextName>${bySecond}</contextName>
    ......
</configuration>

Logger 是用元素配置的

属性类型描述
namestringlogger名称
levelstring可选,Level 属性的值大小写无关,其值为下面其中一个字符串:TRACE、DEBUG、INFO、WARN、ERROR、ALL 和 OFF。还可以是一个特殊的字符串“INHERITED”或其同义词,“NULL”,表示强制继承上级的级别
additivityboolean可选,false取消appender 累积行为,默认为true

​ logger元素可以包含零个或多个元素,表示这个 appender 会被添加到该 logger。强调一下,每个用元素声明的 logger,首先会移除所有 appender,然后才添加引用了的appender, 所以如果logger没有引用任何appender, 就会失去所有appender。

root元素配置根 logger

​ 根logger没有 name 属性,因为已经被命名为“ROOT”,属性元素

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

  <root level="DEBUG"> 
    <appender-ref ref="STDOUT" /> 
  </root> 
</configuration> 

Appender 用元素配置

属性类型描述
namestringappender 的名称,必填
classstringappender 类的全限定名,必填

元素可以包含零个或多个元素、零个或多个元素和零个或多个元素。除了这三个常用元素之外,还可以包含 appender 类的任意数量的 javabean属性。

<configuration> 
  <appender name="FILE" class="ch.qos.logback.core.FileAppender"> 
    <file>myApp.log</file> 
    <encoder> 
      <pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n 
      </pattern> 
    </encoder> 
  </appender> 

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
    <encoder> 
      <pattern>%msg%n</pattern> 
    </encoder> 
  </appender> 

  <root level="debug"> 
    <appender-ref ref="FILE" /> 
    <appender-ref ref="STDOUT" /> 
  </root> 
</configuration> 

​ 默认情况下,appender 是可累积的:logger 会把记录输出到它自身的 appender 和它所有祖先的 appender。因此,把同一 appender 关联到多个 logger 会导致重复输出。 如果你觉得默认的累积行为不合适,可以设置叠加性标识为 false 以关闭它。 这样的话,logger 树里的某个分支可以输出到与其他 logger 不同的 appender。

<configuration> 
  <appender name="FILE" class="ch.qos.logback.core.FileAppender"> 
    <file>foo.log</file> 
    <encoder> 
      <Pattern> 
        %date %level [%thread] %logger{10} [%file : %line] %msg%n 
      </Pattern> 
    </encoder> 
  </appender>   <appender name="STDOUT" 
class="ch.qos.logback.core.ConsoleAppender"> 
    <encoder> 
      <Pattern>%msg%n</Pattern> 
    </encoder> 
  </appender> 

  <logger name="chapters.configuration.Foo" additivity="false"> 
    <appender-ref ref="FILE" /> 
  </logger> 

  <root level="debug"> 
    <appender-ref ref="STDOUT" /> 
  </root> 
</configuration> 

元素的 class 属性是必要的,表示将被实例化的 layout 类的全限定名 。元素可以包含 layout 的的 javabean 属性。因为太常用了,所以当当 layout 是 PatternLayout 时,可以省略 class 属性

元素class 属性是必要的,表示将被实例化的 encoder 类的全限定名。因为太常用了,所以当当 encoder 是 PatternLayoutEncoder 时,可以省略 class 属性

直接可以使用的 appender

ConsoleAppender、FileAppender、 RollingFileAppender

ConsoleAppender

ConsoleAppender 把事件添加到控制台,更准确地说是 System.out 或 System.err,默认为前者。 ConsoleAppender 按照用户指定的 encoder 对事件进行格式化

属性名类型描述
encoderEncoder决定把事件写入到底层OutputStreamAppender 的方式
targetString字符串 “System.out”或 “System.err ”。默认为“System.out”
<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>%-4relative [%thread] %-5level - %msg%n</pattern> 
    </encoder> 
  </appender> 

  <root level="DEBUG"> 
    <appender-ref ref="STDOUT" /> 
  </root> 
</configuration> 

FileAppender

把记录事件添加到文件。目标文件通过File 选项指定。如果文件已经存在,则根据 Append 属性追加或清空文件

属性名类型描述
appendboolean如果 true,事件被追加到现存文件尾部。如果 false,清空现存文件.默认为 true
encoderEncoder决定把事件写入到底层OutputStreamAppender 的方式
fileString被写入的文件名。如果文件不存在,则创建之。如果文件的父目录不存在,FileAppender 会自动创建各级不存在的目录
prudentboolean
<configuration> 
  <appender name="FILE" class="ch.qos.logback.core.FileAppender"> 
    <file>testFile.log</file> 
    <append>true</append>     
    <encoder> 
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n 
      </pattern> 
    </encoder> 
  </appender> 

  <root level="DEBUG"> 
    <appender-ref ref="FILE" /> 
  </root> 
</configuration> 

RollingFileAppender

RollingFileAppender 有两个与之互动的重要子组件。第一个是RollingPolicy,负责滚动。第二个是 TriggeringPolicy,决定是否以及何时进行滚动。所以,RollingPolicy 负责“什么”, TriggeringPolicy 负责“何时”。

属性名类型描述
fileString被写入的文件名。如果文件不存在,则创建之。如果文件的父目录不存在,FileAppender 会自动创建各级不存在的目录
appendboolean如果 true,事件被追加到现存文件尾部。如果 false,清空现存文件.默认为 true
encoderEncoder决定把事件写入到底层OutputStreamAppender 的方式
rollingPolicyRollingPolicy当发生滚动时,决定 RollingFileAppender 的行为
triggeringPolicyTriggeringPolicy告知 RollingFileAppender 何时激活滚动
prudentboolean

RollingPolicy滚动策略

RollingPolicy 负责滚动步骤,涉及文件移动和重命名

FixedWindowRollingPolicy、TimeBasedRollingPolicy

FixedWindowRollingPolicy

属性名类型描述
minIndexint窗口索引的最小值
maxIndexint窗口索引的最大值
fileNamePatternString例如,对于最小值和最大值分别是 1 和3 的文件名模式。该属 性 还 可 以 指 定 文 件 压 缩 选 项 。 例 如

由于固定窗口滚动策略需要的文件重命名操作与窗口大小一样多,所以强烈建议不要使用太大的窗口大小。 当用户指定过大的窗口大小时,当前的代码会自动将窗口大小设为 12。

假设“minIndex”是 1,“maxIndex”3,“fileNamePatter”是“foo%i.log” 。

滚动文件数量活动输出目标归档记录文件描述
0foo.log-还没发生滚动,记录到初始文件
1foo.logfoo1.log第1次滚动。 foo.log被重命名为foo1.log。创建新foo.log
2foo.logfoo1.log、foo2.log第 2 次滚动。foo1.log 被重命名为 foo2.log。foo.log 被重命名为 foo1.log。创建新 foo.log 并成为活动输出目标
3foo.log第 3 次滚动。foo2.log 被重命名为 foo1.log。foo1.log 被重命名为 foo2.log。foo.log 被重命名为 foo1.log。创建新 foo.log 并成为活动输出目标
4foo.log此时及此后,发生滚动时会先删除 foo3.log。其他文件按照上面的步骤被重命名。此时及此后,将有3 个归档记录文件和 1 个活动记录文件
<configuration> 
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>testFile.log</file> 
    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> 
      <fileNamePattern>testFile.%i.log.zip</fileNamePattern> 
      <minIndex>1</minIndex> 
      <maxIndex>3</maxIndex> 
    </rollingPolicy> 
    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> 
      <maxFileSize>5MB</maxFileSize> 
    </triggeringPolicy> 
    <encoder> 
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n
      </pattern> 
    </encoder> 
  </appender> 

  <root level="DEBUG"> 
    <appender-ref ref="FILE" /> 
  </root> 
</configuration> 

TimeBasedRollingPolicy

它根据时间来制定滚动策略,TimeBasedRollingPolicy 既负责滚动也负责触发滚动。TimeBasedRollingPolicy 同时实现了 RollingPolicy 接口和 TriggeringPolicy 接口

属性名类型描述
fileNamePatternString必需。定义滚动(归档)记录文件的名字。其值应当包含文件名及“%d”格式转换符。“%d”可以包含一个java.text.SimpleDateFormat 指定的日期时间模式。如果没有指定日期时间模式,则默认为 yyyy-MM-dd。RollingFileAppender的file可有可无。通过设置“file”属性,可以为活动文件和归档文件指定不同的位置。当前记录总是被指向由“f ile”属性指定的文件。如果有“f ile”属性,则活动文件的名字不会改变。而如果没有“f ile”属性,则活动文件的名字会根据“fileNamePattern”的值每隔一段时间就重新计算一次。“ %d{} ” 里 的 日 期 时 间 模 式 遵 循SimpleDateFormat的约定。
maxHistoryint控制被保留的归档文件的最大数量,超出数量就删除旧文件。例如,假设每月滚动,且 maxHistory 是 6,则只保留最近 6 个月的归档文件,删除之前的文件。注意当删除旧归档文件时,那些为了归档而创建的目录也会被删除
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Docker可以与Logback集成,以便在Docker容器中记录日志。要在Docker中使用Logback,您需要进行以下步骤: 1. 首先,确保您已经安装和配置了Docker和ELK(Elasticsearch、Logstash、Kibana)堆栈,您可以根据引用和引用中的步骤进行安装和配置。 2. 在您的应用程序的pom.xml文件中添加Logback的依赖项。例如,添加以下依赖项: ```xml <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> ``` 3. 创建一个logback.xml文件,该文件包含Logback的配置信息。您可以在该文件中定义日志的格式、输出目标等。以下是一个简单的logback.xml示例: ```xml <configuration> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <root level="debug"> <appender-ref ref="STDOUT"/> </root> </configuration> ``` 在这个示例中,日志将输出到控制台,并且使用了指定的格式。 4. 在您的应用程序中,根据您使用的编程语言和框架,将Logback配置为使用指定的logback.xml文件。这通常涉及到在应用程序的配置文件中指定日志的配置文件路径或在代码中进行相应的配置。 5. 构建和运行您的应用程序的Docker镜像。确保将上述步骤中所定义的logback.xml文件包含在Docker镜像中。 例如,使用Dockerfile构建镜像时,可以添加以下指令将logback.xml文件复制到镜像中: ``` COPY logback.xml /path/to/logback.xml ``` 然后,在Dockerfile中指定使用该logback.xml文件: ``` ENTRYPOINT ["java", "-Dlogback.configurationFile=/path/to/logback.xml", "-jar", "your-application.jar"] ``` 这将告诉应用程序在容器中使用指定的logback.xml文件进行日志记录。 如此一来,您的Docker容器将使用Logback来记录应用程序的日志。您可以根据需要进行自定义配置,以满足您的特定需求。请注意,这只是一个简单的示例,实际配置可能因您的应用程序和环境而有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值