原创Log4j学习----会飞的猪

在前面,我们学习到了关于Log4j的一些知识,如它的构成由三大重要组成部分构成,Logger、Appenders、Layout。相关的作用,这里就不一一介绍了。

如Logger:控制要启用或禁用哪些日志记录语句,并对日志信息进行级别限制:Appenders指定了日志将打印到控制台还是文件中;而Layout则控制日志信息的显示格式。

下面简单介绍下,如何创建Logger对象及配置log4j.properties文件。

A).Logger对象的获得或创建
            Logger被指定为实体,由一个String类的名字识别。Logger的名字是大小写敏感的,且名字之间具有继承关系,子名用父名作为前缀,用点“.”分隔,例如x.y是x.y.z的父亲。
       root Logger(根Logger)是所有Logger的祖先,它有如下属性:
        1.它总是存在的。
        2.它不可以通过名字获得。
        root Logger可以通过以下语句获得:

      public static Logger Logger.getRootLogger();       或:     public static Logger Logger.getLogger(Class clazz)

其中调用Logger.getLogger(Class clazz)是目前ogger对象最理想的方法。

对日志级别进行说明:

B)日志级别
       每个Logger都被了一个日志级别(log level),用来控制日志信息的输出。日志级别从高到低分为:
       A:off         最高等级,用于关闭所有日志记录。
       B:fatal       指出每个严重的错误事件将会导致应用程序的退出。
       C:error      指出虽然发生错误事件,但仍然不影响系统的继续运行。
       D:warm     表明会出现潜在的错误情形。
       E:info         一般和在粗粒度级别上,强调应用程序的运行全程。
       F:debug     一般用于细粒度级别上,对调试应用程序非常有帮助。
       G:all           最低等级,用于打开所有日志记录。

C)输出端Appender
       Appender用来指定日志信息输出到哪个地方,可以同时指定多个输出目的地。Log4j允许将信息输出到许多不同的输出设备中,一个log信息输出目的地就叫做一个Appender。
  每个Logger都可以拥有一个或多个Appender,每个Appender表示一个日志的输出目的地。可以使用Logger.addAppender(Appender app)为Logger增加一个Appender,也可以使用  Logger.removeAppender(Appender app)为Logger删除一个Appender。
 以下为Log4j几种常用的输出目的地。
 a:org.apache.log4j.ConsoleAppender:将日志信息输出到控制台。
 b:org.apache.log4j.FileAppender:将日志信息输出到一个文件。
 c:org.apache.log4j.DailyRollingFileAppender:将日志信息输出到一个日志文件,并且每天输出到一个新的日志文件。
 d:org.apache.log4j.RollingFileAppender:将日志信息输出到一个日志文件,并且指定文件的尺寸,当文件大小达到指定尺寸时,会自动把文件改名,同时产生一个新的文件。
 e:org.apache.log4j.WriteAppender:将日志信息以流格式发送到任意指定地方。
 f::org.apache.log4j.jdbc.JDBCAppender:通过JDBC把日志信息输出到数据库中。

日志格式化器Layout
有三种:
HTMLLayout:格式化日志输出为HTML表格形式:如下
SimpleLayout:以一种非常简单的方式格式化日志输出,它打印三项内容:级别-信息
例:INFO - info
PatternLayout::根据指定的转换模式格式化日志输出,或者如果没有指定任何转换模式,就使用默认的转化模式格式。

Log4j的配置

配置Log4j环境就是指配置root Logger,包括把Logger为哪个级别,为它增加哪些Appender,以及为这些Appender设置Layout,等等。因为所有其他的Logger都是root Logger的后代,所以它们都继承了root Logger的性质。这些可以通过设置系统属性的方法来隐式地完成,也可以在程序中调用XXXConfigurator.configure()方法来显式地完成。有以下几种方式来配置Log4j。
A:配置放在文件里,通过环境变量传递文件名等信息,利用Log4j默认的初始化过程解析并配置。
B:配置放在文件里,通过应用服务器配置传递文件甸等信息,利用一个特定的Servlet来完成配置。
C:在程序中调用BasicConfigor.configure()方法。
D:配置放在文件里,通过命令行PropertyConfigurator.configure(args[])解析log4j.properties文件并配置Log4j。
下面对BasicConfigurator.configure()方法和PropertyConfigurator.config()方法分别进行介绍。
BasicConfigurator.configure()方法:
它使用简单的方法配置Log4j环境。这个方法完成的任务是:
1:用默认的方式创建PatternLayout对象p:
  PatternLayout p = new PatternLayout("%-4r[%t]%-5p%c%x-%m%n");
2:用p创建ConsoleAppender对象a,目标是System.out,标准输出设备:
 ConsoleAppender a = new CpnsoleAppender(p,ConsoleAppender.SYSTEM_OUT);
3:为root Logger增加一个ConsoleAppender p;
 rootLogger.addAppender(p);
4:把rootLogger的log level设置为DUBUG级别;
 rootLogger.setLevel(Level.DEBUG);

PropertyConfigurator.configure()方法:
当使用以下语句生成Logger对象时:

 static Logger logger = Logger.getLogger(mycalss.class);

如果没有调用BasicConfigurator.configure(),PropertyConfigurator.configure()或DOMConfigurator.configure()方法,Log4j会自动加载CLASSPATH下名为log4j.properties的配置文件。如果把此配置文件改为其他名字,例如my.properties,程序虽然仍能运行,但会报出不能正确初始化Log4j系统的提示。这时可以在程序中加上:

PropertyConfigurator.configure("classes/my.properties");  //此处有问题,我做测试时,没有将信息成功写入数据库,而且提示找不到 my.properties 文件。这个问题依然没有解决。

下面我们对“%d %t %p %l %m %n”一一讲解:

%d输出日志时间点的日期或时间

%t  产生该日志事件的线程名;

%p 日志的log_level,如DEBUG、WARN或者INFO;

%c  输出所属的类目,通常就是所在类的全名,如“iNotes.Default”;

%m 日志的内容;

%l  输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。

%X{userId}:就是取出MDC的代码

OK!到此,我们初步了解了log4j。下面就开始 Happy实战吧、、、、

===========================我是华丽的分割线=============================

Log4J使用笔记中我们已经知道同一个日志信息可以同时输出到多个输出目的地。那么在下面的例子中我将演示将日志信息同时输出到控制台,文件和数据库中。首先创建一张表,如下:

log.sql

CREATE TABLE `log` (
  `id` int(4) NOT NULL AUTO_INCREMENT COMMENT ‘自增id号‘,
  `username` varchar(45) NOT NULL DEFAULT ‘‘ COMMENT ‘用户名‘,
  `msg` varchar(555) DEFAULT NULL COMMENT ‘日志信息‘,
  `level` varchar(45) DEFAULT NULL COMMENT ‘当前日志的级别‘,
  `createTime` datetime NOT NULL DEFAULT ‘0000-00-00 00:00:00‘ COMMENT ‘创建时间‘,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8;

编写配置文件log4j.properties

#定义3个输出端
log4j.rootCategory=INFO,A1,A2,A3

#定义A1输出到控制器
log4j.appender.A1=org.apache.log4j.ConsoleAppender
#定义A1的布局模式为PaternLayout
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
# 定义A1的输出格式
log4j.appender.A1.layout.ConversionPattern=%4p [%t] (%F:%L) - %m%n

#定义A2输出到文件
log4j.appender.A2=org.apache.log4j.RollingFileAppender
#定义A2输出到哪个文件
log4j.appender.A2.File=./Test.log
#定义A2输出文件的最大长度
log4j.appender.A2.MaxFileSize = 3KB
#定义A2的备份文件数
log4j.appender.A2.MaxBackupIndex = 3
#定义A2的布局模式为PatternLayout
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
#定义A2的输出模式
log4j.appender.A2.layout.ConversionPattern=%d{yyyy-MM-dd hh:mm:ss}:%p %t %c - %m%n

#定义A3输出到数据库
log4j.appender.A3=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.A3.URL=jdbc:mysql://localhost:3306/test
log4j.appender.A3.driver=com.mysql.jdbc.Driver
log4j.appender.A3.user=root
log4j.appender.A3.password=root
#定义A3的布局和执行的SQL语句
log4j.appender.A3.layout=org.apache.log4j.PatternLayout
log4j.appender.A3.layout.ConversionPattern=Insert into log(username,msg,level,createTime) values(‘%X{username}‘,‘%m‘,‘%-5p‘,‘%d{yyyy-MM-dd hh:mm:ss}‘)

新建一个Log4jTest.java

public class Log4jTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Logger logger =Logger.getLogger(Log4jTest.class);
        String username = "会飞的猪";
        MDC.put("username",username);
        logger.info("Test for MDC.");

        /*logger.debug("Here is DEBUG messgae");
                 logger.info("Here is INFO message");
                 logger.warn("Here is WARN message");
                 logger.error("Here is ERROR message");
                logger.fatal("Here is FATAL message");*/
    }

}

依次可以看到

好了,至此,log4j就测试成功了。可以将用户的一些信息,通过MDC,写入数据库。大家可以开心的嗨起来了喽。

祝大家顺利!欢迎转载!

时间: 2024-10-09 15:23:43

原创Log4j学习----会飞的猪的相关文章

Log4J学习【一】Log4J简介

Log4J简介 基本上所有的大型应用,包括我们常用的框架,比如hibernate:spring:struts等,在其内部都做了一定数量的日志信息.为什么要做这些日志信息,在系统中硬编码日志记录信息是调试系统,观察系统运行状态的一种方式.可能大部分程序员都还记得自己最开始写代码的时候,写一个方法总是出错,就喜欢使用System.out.println("1111111")之类的代码来查看程序的运行是否按照自己想要的方式在运行,其实这些sysout就是日志记录信息,但使用System.ou

log4j学习二-log4j认识

log4j(标准日志工具)三大组件: logger appender layout 例如: ? 1 2 3 log4j.logger.myTest2=INFO,B   log4j.appender.B=org.apache.log4j.ConsoleAppender   log4j.appender.B.layout=org.apache.log4j.PatternLayout  日志级别: off---------------------------------最高等级的,用于关闭所有日志记录

log4j学习一:解决系统日志错位问题

这两天,开发的系统遇到了一个非常奇怪的问题,我们的前台程序会将日志时而输出到webapp.log,时而输出到其他日志文件如AlarmThreshold.log中,初看并无规律,但秉着"机器永远不会出错,出错的总是人"这一理念,试着分析原因. log4j是java使用最为广泛的日志框架,它的使用也相对简单,通过配置appender,logger来定义日志的输出位置,输出格式等,也可以将数据输出到控制台,远程文件系统,数据库等.下面给出一个log4.xml的配置文件: <?xml v

(原创)c#学习笔记02--编写c#程序03--Windows Forms应用程序

2.3  Windows Forms应用程序 本解讲解如何创建一个windows forms应用程序,参考:(原创)c#学习笔记02--编写c#程序01--开发环境,修改为选择:Windows 窗体应用程序.如下图: 单击“确定”(OK)按钮,创建项目后,应该会看到一个空白的Windows窗体.把鼠标指针移到屏幕左边的“工具箱”(Toolbox)栏上,然后移到“所有 Windows 窗体”(All Windows Forms)选项卡上的Button选项,在该选项上双击,就会在应用程序的主窗体(F

log4j学习(一)最简单的例子

前言: 之前笔者一直是在System.out中打日志的,由于笔者大部分时候是编写在tomcat容器里运行的一些个小web应用,所以这么做似乎没什么问题:打印出来的日志都可以在tomcat自己的log目录下的一些个日志文件里找到.但是,最近笔者接触到一个项目,需要编写一个不依赖于容器的能够直接在系统上运行的socket服务器程序,使得笔者急需一个能够打自己日志的地方,于是开始学习log4j.顺便,也逼迫笔者真正的好好学习关于流.比http更为底层TCP和其对应的socket通信.多线程等知识. 正

Log4J学习【二十三】常用的Appender之SocketAppender

前面这几个Appender就是Log4J提供的基于文件系统的Appender.当然,在一些特殊的需要记录到文件的Appender来说,我们只需要选择一个合适的Appender来继承并完成自己的逻辑即可.关于自定义Appender,待会再看.下面来看几个比较特殊的Appender. 前面所有介绍的Appender都有一个共同的特点,就是他们都需要配置一个Layout对象,下面要介绍的这个Appender非常特殊,他本身不需要任何Layout对象,这个Appender就是SocketAppender

会飞的猪(Pig)

猪会飞么? 提高pig的性能,让猪飞起来有例如以下办法:1. 尽早地并常常地进行过滤2. 尽早地并常常地进行映射3. 正确并合理地使用Join4. 选择正确的数据类型,合适的并行值5. 调整pig 的性能属性:pig.cachedbag.menusage 和pig.skewedjoin.reduce.memusage6. 对中间结果进行压缩 Describe 命令会显示脚本中指定关系的模式. explain 能够深入到pig内部看怎样将用户的脚本编译成MapReduce任务的. illustra

log4j学习总结

log4j是一个优秀的日志组件,基本上所有的java开发项目都会用到它.下面将自己学习的一些心得总结一下,方便以后学习. log4j在项目中都不会单独使用,至少是我写过的java项目中没有.一般来说log4j是和commons-logging组件一同使用. commons-logging和log4j的关系就像是jdbc和mysql数据库一样,一个是工厂方法,一个是具体的实现,好处:1,逻辑代码是实现分离2.维护变少.其中第二点是很重要的.配置比单独使用log4j组件还要简单. 先说一下原理. 项

log4j学习(二)不同类的日志输出到不同的文件

目的:一个应用中有两个不同作用的后台服务,我们需要把他们的日志分开,存放到2个不同的日志文件中. 办法:需要在log4j.properties文件中配置两个不同的logger和对应的appender log4j.logger.logger1=debug,appender1 log4j.appender.appender1=org.apache.log4j.FileAppender log4j.appender.appender1.File=C:/Users/yang/Desktop/testpr