JavaEE——使用log4j进行日志管理

时间:2022-09-17 08:22:26

1、Log4j简介

  作用:

1、 跟踪代码的运行轨迹。

2、 输出调试信息

三大组成:

1、 Logger-生成日志。

2、 Appender-定义日志输出的目的地。

3、 Layout-指定日志输出的格式。

2、Logger组件

                  日志共分为5种级别(ON开,OFF关这两个不计算在内),从高到底(从严重到轻微)排序为:

                   FATAL—严重的错误,可能会导致程序不能正常运行. 类似System.exit(),整个项目都不能运行

                  ERROR– 错误,影响程序的正常运行。           类似当前线程挂了,但其它线程或组件还在跑

                   WARN– 警告,不会影响程序的运行。最好将此问题修正。

                    INFO – 一般信息。不影响程序的运行。可能是用户的调试信息。可有可无。等同于syserr

                    DEBUG – 一般的信息。等同于sysout

                 上面五种级别分别对应以下几个方法

                       fatal(Object)

                       error(Object)

                       warn(Object)

                        info(Object)

                        debug(Object)

              当信息大于或是等于配置的级别时才会输出日志


3、Appender组件

  (仅要求记住两个)

  Console – 控制台。org.apache.log4j.ConsoleAppender

  File   - 文件。 org.apache.log4j.FileAppender, org.apache.log4j.RollingFileAppender


4、Layout组件

  功能是定义日志的输出格式

  org.apache.log4j.HTMLLayout

  org.apache.log4j.PatternLayout (自定义)

  org.apache.log4j.SimpleLayout

 

  对于自定义格式,see page 256 chart 17-1。

  %d%p %c %m%n是我经常用的格式,要求记住.

  %d –具体的时间.

  %p –优先级

  %c –信息的输出类

  %L—行号

  %m –信息文本

  %n —换行符


5、Log4j的基本使用方法

    步1、将log4j.jar文件,Copy到WEB-INF/lib)目录下。

    (此时发布程序,启动程序,会发出警告信息。信息要求配置log4j.properties文件)

  步2、在src目录下(即WEB-INF/classes)建立一个log4j.properties文件

    在WEB-INF/classes目录下,为log4j的默认目录。Log4j.properties也是log4j的默认文件名。

  步3、书写log4j.properties文件如下:

   #####配置根元素

log4j.rootLogger=INFO,file,console

#file的输入地址为文件

log4j.appender.file=org.apache.log4j.RollingFileAppender

#以下是具体的目录

log4j.appender.file.File=d:/a.log

#每个文件的最大大小

log4j.appender.file.MaxFileSize=512KB

#最多可以是多少个文件

log4j.appender.file.MaxBackupIndex=3

#信息的布局格式-按指定的格式打出

log4j.appender.file.layout=org.apache.log4j.PatternLayout

#具体的布局格式 - %d为时间

log4j.appender.file.layout.ConversionPattern=%d%p[%c]%m%n

 

#以下配置输出到控制台

log4j.appender.console=org.apache.log4j.ConsoleAppender

log4j.appender.console.layout=org.apache.log4j.PatternLayout

log4j.appender.console.layout.ConversionPattern=%d%p[%c]%m%n

 

####以下配置自己的类输出日志的信息,即将com.three包下的日志输出到的目录

###同时也会打出到控制台。尽管是没有配置打出到控制台。但依据log4j的继承性,它仍然具体打出的控制台的功能。

log4j.category.com.three=INFO,myFile

log4j.appender.myFile=org.apache.log4j.RollingFileAppender

log4j.appender.myFile.File=d:/b.txt

log4j.appender.myFile.layout=org.apache.log4j.PatternLayout

log4j.appender.myFile.layout.ConversionPattern=%d%p[%c]%m%n

具体的说明,请参考上面以#号注释的部分。

注意上面红体字下面的部分,是书上没有讲的。此部分只配置对com.three包下的类指出日志信息。掌握具体配置的方法。

使用

<span style="color:#330033;">package cn.hncu.reg.sendMail;

import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.Message.RecipientType;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import org.apache.log4j.Logger;

public class SendEMailThread extends Thread {
private String acode;
private Logger log=Logger.getLogger(SendEMailThread.class);
public SendEMailThread(String acode) {
this.acode = acode;
}

@Override
public void run() {
Properties p=new Properties();
p.setProperty("mail.host", "smtp.sina.com");
p.setProperty("mail.smtp.auth", "true");
Session session=Session.getDefaultInstance(p, new Authenticator() {

@Override
protected PasswordAuthentication getPasswordAuthentication() {
PasswordAuthentication pa=new PasswordAuthentication("hncujava", "1234567");
return pa;
}
});
session.setDebug(true);
MimeMessage msg=new MimeMessage(session);

try {
msg.setFrom( new InternetAddress("hncujava@sina.com") );
msg.setRecipient(RecipientType.TO, new InternetAddress("747205398@qq.com"));
msg.setSubject("激活hncu账号");
StringBuilder sb=new StringBuilder();
sb.append("请激活邮箱:<a href='http://127.0.0.1:8080/mailWeb/ActiveServlet");
sb.append("?acode="+acode+" '>点击激活</a>");
sb.append("<br/>如果激活未成功,请复制下面地址到浏览器地址栏进行手动激活:");
sb.append("http://www.hncu.cn/mailWeb/ActiveServlet?acode="+acode);
msg.setContent(sb.toString(),"text/html;charset=utf-8");
Transport.send(msg);
log.info("邮件发送成功");
} catch (AddressException e) {
log.error("邮箱地址错误,邮件发送失败");
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
log.error("邮箱信息格式错误,邮件发送失败");
}
}

}</span>