1、日志框架:
  工作中要进行Java输出日志时,你需要一个或者多个日志框架。框架能提供对象、方法和必要的配置来发送日志信息。Java语言本身有自带的日志实现包java.util.logging。还有很多第三方的日志框架,包括log4j、log4j 2、logback。sl4j和Apache Commons Logging提供了日志的抽象层次,通过它可以从底层的日志框架实现解耦合,从而在不同的日志框架间切换。关于sl4j和logback的日志学习和使用可以参看好朋友的博文(https://fengmengzhao.github.io/2018/06/12/detailed-explanation-of-java-logging-framework.html)。本篇旨在让你能够轻松使用log4j日志框架。

2、log4j日志框架
  Log4j API设计为分层结构,其中每一层提供了不同的对象,对象执行不同的任务。这使得设计灵活,根据将来需要来扩展。Log4j的框架的核心对象即为log4j的核心组件。
Log4j框架的主要学习其:核心对象、支持对象、配置、支持的功能实现。
2.1 Log4j框架对象
2.1.1核心对象: 框架的强制对象和框架的使用,包括:
1)Logger对象:顶级层的Logger,它提供Logger对象。Logger对象负责捕获日志信息及它们存储在一个空间的层次结构。
2)LayOut布局对象:该层提供其用于格式化不同风格的日志信息的对象。布局层提供支持Appender对象到发布日志信息之前。
我们使用的PatternLayout 使用 appender。所有可能的选项有:
•    DateLayout
•    HTMLLayout
•    PatternLayout
•    SimpleLayout
•    XMLLayout
使用HTMLLayout和XMLLayout,可以在HTML和XML格式和生成日志。

--HTMLLayout布局对象
如果想生成一个HTML格式的文件,日志信息,那么可以使用 org.apache.log4j.HTMLLayout 格式化日志信息。HTMLLayout类扩展抽象org.apache.log4j.Layout类,并覆盖其基类的 format()方法来提供HTML样式格式。其提供了以下信息显示:
  •    生成特定的日志事件之前,从应用程序的开始所经过的时间
  •    调用该记录请求的线程的名称
  •    与此记录请求相关联的级别
  •    日志记录器(Logger)和记录消息的名称
  •    可选程序文件的位置信息,并从其中记录被调用的行号
HTMLLayout是一个非常简单的布局对象,它提供以下方法:

setContentType(String)
设置 text/html 为 HTML内容的内容类型。默认为 text/html setLocationInfo(String)
设置位置信息记录事件。默认为 false setTitle(String)
设置为HTML文件的标题。默认值是Log4j的日志信息

简单示例:

log4j.properties文件:
# Define the root logger with appender file
log = D\://ceshiZJB/learnLogs/log4-demo
log4j.rootLogger = DEBUG, FILE # Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=${log}/htmlLayout.html # Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.HTMLLayout
log4j.appender.FILE.layout.Title=HTML Layout Example
log4j.appender.FILE.layout.LocationInfo=true
import java.io.*;
import java.sql.SQLException; import org.apache.log4j.Logger; public class log4jExample{
/* Get actual class name to be printed on */
static Logger log = Logger.getLogger(
log4jExample.class.getName()); public static void main(String[] args)
throws IOException,SQLException{ log.debug("Hello this is an debug message");
log.info("Hello this is an info message");
}
}

备注:一个具有HTML格式的日志文件的一大优势是,它可以被发布为网页可以远程查看。
--PatternLayout布局对象
如果想生成基于模式的特定格式的日志信息,那么可以使用 org.apache.log4j.PatternLayout 格式化日志信息。
PatternLayout类扩展抽象 org.apache.log4j.Layout 类并覆盖format()方法根据提供的模式构建日志信息。
PatternLayout也是一个简单的布局对象,它提供conversionPattern属性(设置转换模式。默认为 %r [%t] %p %c %x - %m%n),可以通过配置文件进行设置。
参看文章地址:https://www.yiibai.com/log4j/log4j_patternlayout.html
3)Appender对象:下位层提供Appender对象,Appender对象负责打印日志信息到不同的目的地,如控制台,文件,sockets,NT事件日志,数据库等,可以通过包括以下方法的配置文件,设置一个 Appender 对象添加到记录器:

方法1:log4j.logger.[logger-name]=level, appender1,appender..n
方法2:可以编写以XML格式相同的结构如下:
<logger name="com.apress.logging.log4j" additivity="false">
<appender-ref ref="appender1"/>
<appender-ref ref="appender2"/>
</logger>
方法3:如果想要添加Appender对象到程序,那么可以使用下面的方法:
public void addAppender(Appender appender);
addAppender()方法添加一个appender到Logger对象。作为示例配置演示,可以添加很多Appender对象到记录器在逗号分隔的列表,每个打印日志信息分离目的地。

日志追加到一个文件中:即写日志信息到一个文件中,必须使用org.apache.log4j.FileAppender。有以下FileAppender的配置参数:

immediateFlush

标志的默认设置为true,这意味着输出流的文件被刷新,在每个追加操作

encoding

它可以使用任何字符编码。默认情况下是特定于平台的编码方案

threshold

这个 appender 阈值级别

Filename

日志文件的名称

fileAppend

默认设置为true,这意味着记录的信息被附加到同一文件的末尾

bufferedIO

此标志表示是否需要写入缓存启用。默认设置为false

bufferSize

如果 bufferedI/O 启用,这表示缓冲区的大小,默认设置为8KB

日志追加到多个文件中:当想生成每一天的日志文件,以保持日志记录信息的良好记录。日志记录信息纳入日常的基础文件,就必须它扩展FileAppender类,并继承其所有属性useorg.apache.log4j.DailyRollingFileAppender类。除了如上所述属性,FileAppender还有一个重要的配置参数:DatePattern (这表示在滚动的文件,并按命名惯例来执行。默认情况下,在每天午夜滚动)
DatePattern控制使用下列滚动的时间表方式之一:

DatePattern

描述

'.' yyyy-MM

滚动在每个月的结束和下一个月初

'.' yyyy-MM-dd

这是默认值,每天午夜滚动

'.' yyyy-MM-dd-a

滚动每一天的午夜和中午

'.' yyyy-MM-dd-HH

滚动在每一个小时

'.' yyyy-MM-dd-HH-mm

滚动在每一个分钟

'.' yyyy-ww

滚动每个星期取决于区域设置时的第一天

简单示例:

# Define the root logger with appender file
log = D\://ceshiZJB/learnLogs/log4-demo
# Define the root logger with appender file
log4j.rootLogger = DEBUG, FILE # Define the file appender
log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender
# Set the name of the file
log4j.appender.FILE.File=${log}/log.out # Set the immediate flush to true (default)
log4j.appender.FILE.ImmediateFlush=true # Set the threshold to debug mode
log4j.appender.FILE.Threshold=debug # Set the append to false, should not overwrite
log4j.appender.FILE.Append=true # Set the DatePattern
log4j.appender.FILE.DatePattern='.' yyyy-MM-dd-HH-mm # Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n
public class log4jExample{
/* 每分钟生成日志文件
* */
static Logger log = Logger.getLogger(
log4jExample.class.getName());
static Object obj =new Object(); public static void main(String[] args)
throws IOException,SQLException, InterruptedException{ synchronized (obj) {
for(int i=0;i<350;i++){
obj.wait(1000L);
log.debug("Hello this is an debug message"+i);
//log.info("Hello this is an info message");
}
} }
}

日志存放到数据库中
参看文章地址:https://www.yiibai.com/log4j/log4j_logging_database.html#article-start

2.1.2支持对象:可选的对象执行另外重要的任务,log4j框架的其他重要的对象(支持对象)起到日志框架的一个重要作用。包括:
1)Level对象:Level对象(级别对象)用来定义任何记录信息的粒度和优先级。有记录的七个级别在API中定义:OFF, DEBUG, INFO, ERROR, WARN, FATAL 和 ALL
使用DEBUG两个追加程序。所有可能的选项有:org.apache.log4j.Level类提供以下级别,但也可以通过Level类的子类自定义级别。

Level

描述

ALL

各级包括自定义级别

DEBUG

指定细粒度信息事件是最有用的应用程序调试

ERROR

错误事件可能仍然允许应用程序继续运行

FATAL

指定非常严重的错误事件,这可能导致应用程序中止

INFO

指定能够突出在粗粒度级别的应用程序运行情况的信息的消息

OFF

这是最高等级,为了关闭日志记录

TRACE

指定细粒度比DEBUG更低的信息事件

WARN

指定具有潜在危害的情况

2)Filter过滤对象用于分析日志信息及是否应记录或是否需要根据这些信息做出进一步的决定。
  一个appender对象可以有与之关联的几个Filter对象。如:日志记录信息传递给特定Appender对象,经由 Filter对象批准后的日志信息,然后才能发布到所连接的目的地。

方法1:
private static org.apache.log4j.Logger log = Logger.getLogger(LogClass.class);
log.setLevel(Level.WARN);
方法2:
# Define the root logger with appender file
log = /usr/home/log4j
log4j.rootLogger = WARN, FILE # Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=${log}/log.out # Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n

3)ObjectRenderer(对象渲染器)
  ObjectRenderer对象是一个指定提供传递到日志框架的不同对象的字符串表示。这个对象所使用的布局对象来准备最后的日志信息。
4)日志管理对象:管理日志框架。它负责从一个系统级的配置文件或配置类读取初始配置参数。

上述所有学习资料的来源均转自:https://www.yiibai.com/log4j/

学习源码和笔记可在百度网盘进行下载:https://pan.baidu.com/s/1QZ57clyQYUIOBQ5M12vIcg  pg1y

一、log4j日志框架的理论和不同场景使用的更多相关文章

  1. Slf4j+Log4j日志框架入门

    (一).日志系统介绍 slf4j,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统.简答的讲就是slf4j是一系列的 ...

  2. Log4j日志框架小记

    人啊,总是在学习中发现不足,不足中学习,学习中成长. 今天来系统记录一下对于常用日志组件的理解.配置.使用. 仅供参考, 错误之处请各路好汉不吝笔墨批评指正. 转载请注明出处 Log4j日志框架是Ap ...

  3. SpringBoot系列之切换log4j日志框架

    SpringBoot系列之使用切换log4j日志框架 ok,在pom文件右键->Diagrams->show Dependencies....,如图,找到spring-boot-start ...

  4. log4j日志框架学习

    初识Log4j:      log4j有三个部分:           1.loggers 负责捕获日志信息.           2.appenders  负责输出信息到不同的目的地         ...

  5. Spring源码学习:第2步--使用SLF4j+Log4j日志框架替换掉其自身的commons-logging日志框架

    正如Spring官方文档所述,其底层的实现选择了commons-logging作为日志框架.这一"失足"性的选择,竟连Spring自身都抱怨.但是,谁叫Spring如此优秀呢,即使 ...

  6. Log4j日志框架学习零到壹(一)

    日志是系统开发过程中用于排查问题重要的记录.通常使用日志来记录系统运行的行为,什么时间点发生了什么 事情.Java中常用的莫过于Log4j框架了.下面主要围绕Log4j的基础知识.Log4j的使用方式 ...

  7. SpringBoot整合log4j日志框架

    Spring Boot 2.x默认使用Logback日志框架,要使用 Log4j2必须先排除 Logback. 加入修改依赖 <dependency> <groupId>org ...

  8. log4j日志框架的使用

    java.util.logging.Logger——java 中提供的日志类 实际开发 90% 都是使用 log4j 记录日志,而 Log4j 底层就是 java.util.logging.Logge ...

  9. log4J日志框架

    log4j的配置:log4j是一个日志输出框架,就是用于输出日志的,主流框架大部分都是Log4j输出.Spring框架也可以通过Log4j输出日志 Log4j提供了强大的日志输出的自定义功能(1)通过 ...

随机推荐

  1. angular2 单元测试 路由相关

    第一步:在html模板中,写路由链接,并保证有路由出口 第二步:写自定义的路由指令和路由出口组件,因为在单元测试中不需要引入真实的路由,此处我们用虚拟的代替即可. 第三步:将自定义的虚拟路由指令和路由 ...

  2. [转]Serverless

    说起当前最火的技术,除了最新的区块链,AI,还有一个不得不提的概念是Serverless.Serverless作为一种新型的互联网架构直接或间接推动了云计算的发展,从AWS Lambda到阿里云函数计 ...

  3. Java面向对象编程 -5

    代码块 在程序之中使用"{}"定义的结构就称为代码块,而后根据代码块出现的位置以及定义的关键字的不同, 代码块可以分为 普通代码块 构造代码块 静态代码块 同步代码块 其中同步代码 ...

  4. JSON parse error: default constructor not found. class java.time.YearMonth; nested exception is com.alibaba.fastjson.JSONException: default constructor not found. class java.time.YearMonth

    java8新出的YearMonth可以方便的用来表示某个月.我的项目中使用springmvc来接收YearMonth类型的数据时发现 x-www-from-urlencoded 格式的数据可以使用&q ...

  5. codeforces-Three Friends

      Three Friends Three friends are going to meet each other. Initially, the first friend stays at the ...

  6. 总结 jion,group join 基于方法的查询与查询表达式 对比

    数据源: 代码: using (tempdbEntities context = new tempdbEntities()) { #region 基于方法的查询 Console.WriteLine(& ...

  7. numpy.eye() 生成对角矩阵

    numpy.eye(N,M=None, k=0, dtype=<type 'float'>) 关注第一个第三个参数就行了 第一个参数:输出方阵(行数=列数)的规模,即行数或列数 第三个参数 ...

  8. HDU5444 Elven Postman

    按要求递归建树输出~ #include<cstdio> #include<algorithm> #include<cstring> using namespace ...

  9. 吴裕雄 python 神经网络——TensorFlow variables_to_restore函数的使用样例

    import tensorflow as tf v = tf.Variable(0, dtype=tf.float32, name="v") ema = tf.train.Expo ...

  10. Nexus-配置vPC 实验二

    实验一中介绍的是单面的vPC,本实验配置的是dual site(双面vPC),这样的情况将上下的Port-channel都配置在了同一vPC下面. 实验拓扑如下: N5K-1配置:N5K-1(conf ...