写给菜鸟,如何使用logback记录日志和发邮件?

本文介绍了Logback的基本使用方法,包括无配置文件的日志输出、配置文件设置、滚动记录日志及通过邮件发送日志等功能,并提供了详细的配置示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、简易使用logback,不含有logback.xml

  1. 下载 logbackslf4j的几个jar包,包括3个即可:logback-core-1.1.7.jar logback-classic-1.1.7.jarslf4j-api-1.7.21.jar,将这几个包导入到自己的工程中去,鼠标右键点击工程——build path——config build path —— libraries——add extenal jars
  2. 直接在main中写以下代码:

public class Zy_For_logback {

private static final Logger logger = LoggerFactory.getLogger(Zy_For_logback.class);

        public static void main(String[] args) {

         logger.info("我的info");

         logger.error("Goodbye error.");

}

运行此代码即可,此时没有logback.xml配置文件,所以使用的是默认的日志输出格式,2018年只会显示18,默认输出到控制台。

二、加入logback.xml配置文件,将日志输出到控制台:

由于需要将logback.xml 放入到classpath目录下,logback.xml才会有效,那么我们可以在程序代码中检查自己程序的classpath是什么,通过以下两句代码检查即可:

// 获取classpath路径

         String s = Thread.currentThread().getContextClassLoader().getResource("").getPath();

        System.out.println("classpath => " + s );

这两条语句的作用是检查本程序运行时的classpath是什么,运行发现是本工程的bin目录,于是将logback.xml放入bin目录下,logback.xml内容如下:

<?xml version="1.0" encoding="UTF-8" ?>

<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="TRACE">

        <appender-ref ref="STDOUT" />

    </root>

</configuration>

在此xml中,日志的记录时间改成了{YYYY-mm-dd HH:mm:ss.SSS} 格式,日志输出到控制台,程序运行结果如下:

注意:Encoding 属性在logback的新版本中使用会报错,删除即可

三、如何用滚动方式来记录日志?

首先要明白什么是滚动记录日志?看看IIS、apache的日志就明白了,IIS作为一个web服务程序,常年24小时不中断运行【中断了网站就完了】,IIS的日志基本上记录了本网站所有的get、post请求信息,一般说来每天产生一个日志文件,记录每天的日志信息,这种按照天、周、月产生日志的方式就是滚动方式记录日志【这避免了日志长年累月的记录在一个文件中,文件巨大】

滚动方式记录日志的配置,见以下xml代码:

<appender name="LOGS_FILE"  class="ch.qos.logback.core.rolling.RollingFileAppender">

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

            <!--日志文件输出的文件名-->

            <FileNamePattern>${LOG_HOME}/zyApp.%d{yyyy-MM}.txt</FileNamePattern>  

            <MaxHistory>365</MaxHistory>

        </rollingPolicy>  

               <encoder>

                 <Pattern>%d   %logger{50} - %msg%n</Pattern>

               </encoder>

    </appender>

很多资料已经说明了rollingPolicy、MaxHistory的用法,我们可以照抄,需要额外说明的是:如何按照日、月、年来产生相应日志呢?非常简单,如下:

1、每天生成日志: FileNamePattern 设定为 ${LOG_HOME}/zyApp.%d{yyyy-MM-dd}.txt

2、每分钟生成日志: FileNamePattern 设定为 ${LOG_HOME}/zyApp.%d{yyyy-MM-dd_HH-mm}.txt

3、每小时生成日志: FileNamePattern 设定为 ${LOG_HOME}/zyApp.%d{yyyy-MM-dd_HH}.txt

4、每月生成日志: FileNamePattern 设定为 ${LOG_HOME}/zyApp.%d{yyyy-MM}.txt

大家可以试试,我试过,是成功的。

四、如何使用logback发送日志信息给指定邮箱?

见xml代码:

 

<appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">

    <smtpHost>smtp.163.com</smtpHost>

    <to>133243554054@139.com</to>

    <from>wehabve@163.com</from>

        <username>zhangyong911</username>

        <password>高洪喜</password>

    <subject>zy发</subject>

    <layout class="ch.qos.logback.classic.PatternLayout">

          <Pattern>%d-%message</Pattern>

    </layout>

  </appender>

用logback发送日志信息关键在于xml的配置正确,以上配置我试验成功,自己总结以下几条

注意:(1)to 是你发送的目的邮箱;from是你自己的发送邮箱;username是你自己的邮箱用户名;password是自己邮箱的登录密码;subject是你发送的邮件标题;

(2)在程序中 logger.error语句才可以发送邮件,这是因为logback.xml默认配置下logger.error才会发送;

(3)logback.xml中layout一定要有,否则发邮件可能失败

(4)subject中最好含有3个以上字符,如果字符太少可能发送失败;

(5)在eclipse中,一定要先把javax.mail.jar 包加入工程中,因为logback使用javax.mail.jar发送邮件!

(6)如果需要发送邮件,logback建议使用1.1.8以上版本,不建议使用1.1.7版本,因为1.1.7版本在发送邮件时有一个bug,总是有以下提示:

ERROR in ch.qos.logback.core.joran.action.NestedBasicPropertyIA-Unexpected aggregationType AS_BASIC_PROPERTY_COLLECTION

查阅官网,官网说从1.1.8版本开始消除了这个bug,我用1.2.3版本,的确没有这个bug。

(7)evaluator 和 filter 还没有搞明,加上它们后,总是无法发送邮件,原因不明。

     (8)有时候发邮件可能会失败,感觉发邮件不是很稳定

以上是我在eclipse环境下使用logback的心得,基本上够用

 

 

### 动态修改 Logback 输出路径 Logback 是一种流行的 Java 日志框架,支持灵活的日志配置方式。要实现运行时动态修改日志输出路径的功能,可以通过重新加载 `logback` 配置文件或者直接操作其内部组件来完成。 以下是具体方法: #### 方法一:通过程序代码更改 Appender 的 File 路径 可以访问 Logback 中的 `LoggerContext` 具体的 `Appender` 实例,从而更新日志文件路径并刷新该 Appender[^1]。 ```java import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.core.FileAppender; public class DynamicLogFileChange { public static void updateLogFile(String newFilePath) throws Exception { Logger root = (Logger) org.slf4j.LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); LoggerContext lc = root.getLoggerContext(); // 假设我们有一个名为 "FILE" 的 appender FileAppender fileAppender = (FileAppender) root.getAppender("FILE"); if (fileAppender != null) { fileAppender.setFile(newFilePath); // 设置新的文件路径 fileAppender.start(); // 刷新启动 Appender } else { throw new RuntimeException("无法找到指定名称的 FileAppender."); } } public static void main(String[] args) throws Exception { String newPath = "/path/to/new/log/file.log"; updateLogFile(newPath); System.out.println("已成功更改为新日志路径:" + newPath); } } ``` 上述代码片段展示了如何获取根记录器 (`root`) 并调整其中定义的一个特定 `FileAppender` 的目标位置。注意这里假设存在一个命名为 `"FILE"` 的 Appender;实际项目中需匹配自己的配置情况。 #### 方法二:触发外部重载机制 另一种做法是利用 Logback 提供的自动扫描功能或手动调用 API 来强制重新读取配置文件。如果在 XML 文件里指定了 `<configuration scan="true">` 属性,则每次检测到变化都会应用最新的设置。不过这种方式依赖于提前准备好不同版本的配置文档,并不适合完全动态的需求场景。 ```xml <configuration scan="true"> <!-- 其他配置 --> </configuration> ``` 当需要即时生效而非等待周期性轮询时,可显式执行如下命令让上下文立即解析最新状态: ```java LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); loggerContext.reset(); JoranConfigurator configurator = new JoranConfigurator(); configurator.setContext(loggerContext); try { configurator.doConfigure("/new/path/to/logback.xml"); // 加载自定义路径下的配置文件 } catch (Exception e) { e.printStackTrace(); } ``` 这种方法允许切换至全新的配置方案而不仅仅是简单改变某些参数值。 --- ### 注意事项 - 修改过程中应确保线程安全问题得到妥善处理。 - 如果涉及多模块共享同一个 logging context 场景下更要小心同步逻辑以免引发不可预期行为。 - 对生产环境实施此类变更前务必充分测试验证稳定性与兼容性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值