当前位置: 首页 > news >正文

哔哩哔哩黄页网站/企业培训体系搭建

哔哩哔哩黄页网站,企业培训体系搭建,税企互动平台,龙华公司网站建设Commons Logging是一个第三方日志库,它是由Apache创建的日志模块。 Commons Logging的特色是,它可以挂接不同的日志系统,并通过配置文件指定挂接的日志系统。默认情况下,Commons Loggin自动搜索并使用Log4j(Log4j是另…

Commons Logging是一个第三方日志库,它是由Apache创建的日志模块。

Commons Logging的特色是,它可以挂接不同的日志系统,并通过配置文件指定挂接的日志系统。默认情况下,Commons Loggin自动搜索并使用Log4j(Log4j是另一个流行的日志系统),如果没有找到Log4j,再使用JDK Logging。

使用Commons Logging只需要和两个类打交道,并且只有两步:

第一步,通过LogFactory获取Log类的实例; 第二步,使用Log实例的方法打日志。

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;public class Main {public static void main(String[] args) {Log log = LogFactory.getLog(Main.class);log.info("start...");log.warn("end.");}
}

运行上述代码,肯定会得到编译错误,类似error: package org.apache.commons.logging does not exist(找不到org.apache.commons.logging这个包)。因为Commons Logging是一个第三方提供的库,所以,必须先把它下载下来。下载后,解压,找到commons-logging-1.2.jar这个文件,再把这个文件给引入到idea中(引入教程https://www.cnblogs.com/zzzhao/p/12294923.html)

同样Commons Logging定义了6个日志级别:

  • FATAL
  • ERROR
  • WARNING
  • INFO
  • DEBUG
  • TRACE

默认级别是INFO

使用Commons Logging时,如果在静态方法中引用Log,通常直接定义一个静态类型变量:

public class Main {static final Log log = LogFactory.getLog(Main.class);//定义一个静态变量static void foo() {log.info("foo");}
}

在实例方法中引用Log,通常定义一个实例变量:

// 在实例方法中引用Log:
public class Person {protected final Log log = LogFactory.getLog(getClass());//定义一个实例变量void foo() {log.info("foo");}
}

注意到实例变量log的获取方式是LogFactory.getLog(getClass()),虽然也可以LogFactory.getLog(Person.class),但是前一种方式有个非常大的好处,就是子类可以直接使用该log实例。例如:

// 在子类中使用父类实例化的log:
public class Student extends Person {void bar() {log.info("bar");}
}

此外,Commons Logging的日志方法,例如info(),除了标准的info(String)外,还提供了一个非常有用的重载方法:info(String, Throwable),这使得记录异常更加简单,例如:

try {...
} catch (Exception e) {log.error("got exception!", e);
}

使用Log4j

前面介绍了Commons Logging,可以作为“日志接口”来使用。而真正的“日志实现”可以使用Log4j。

Log4j是一种非常流行的日志框架,最新版本是2.x。

Log4j是一个组件化设计的日志系统,它的架构大致如下:

当我们使用Log4j输出一条日志时,Log4j自动通过不同的Appender把同一条日志输出到不同的目的地。例如:

  • console:输出到屏幕;
  • file:输出到文件;
  • socket:通过网络输出到远程计算机;
  • jdbc:输出到数据库

在输出日志的过程中,通过Filter来过滤哪些log需要被输出,哪些log不需要被输出。例如,仅输出ERROR级别的日志。

最后,通过Layout来格式化日志信息,例如,自动添加日期、时间、方法名称等信息。

上述结构虽然复杂,但我们在实际使用的时候,并不需要关心Log4j的API,而是通过配置文件来配置它。

以XML配置为例,使用Log4j的时候,我们把一个log4j2.xml的文件放到classpath下就可以让Log4j读取配置文件并按照我们的配置来输出日志。下面是一个配置文件的例子:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration><Properties><!-- 定义日志格式 --><Property name="log.pattern">%d{MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36}%n%msg%n%n</Property><!-- 定义文件名变量 --><Property name="file.err.filename">log/err.log</Property><Property name="file.err.pattern">log/err.%i.log.gz</Property></Properties><!-- 定义Appender,即目的地 --><Appenders><!-- 定义输出到屏幕 --><Console name="console" target="SYSTEM_OUT"><!-- 日志格式引用上面定义的log.pattern --><PatternLayout pattern="${log.pattern}" /></Console><!-- 定义输出到文件,文件名引用上面定义的file.err.filename --><RollingFile name="err" bufferedIO="true" fileName="${file.err.filename}" filePattern="${file.err.pattern}"><PatternLayout pattern="${log.pattern}" /><Policies><!-- 根据文件大小自动切割日志 --><SizeBasedTriggeringPolicy size="1 MB" /></Policies><!-- 保留最近10份 --><DefaultRolloverStrategy max="10" /></RollingFile></Appenders><Loggers><Root level="info"><!-- 对info级别的日志,输出到console --><AppenderRef ref="console" level="info" /><!-- 对error级别的日志,输出到err,即上面定义的RollingFile --><AppenderRef ref="err" level="error" /></Root></Loggers>
</Configuration>
虽然配置Log4j比较繁琐,但一旦配置完成,使用起来就非常方便。对上面的配置文件,凡是INFO级别的日志,会自动输出到屏幕,而ERROR级别的日志,不但会输出到屏幕,还会同时输出到文件。并且,一旦日志文件达到指定大小(1MB),Log4j就会自动切割新的日志文件,并最多保留10份。

有了配置文件还不够,因为Log4j也是一个第三方库,我们需要从这里下载Log4j,解压后,把以下3个jar包放到classpath中:

  • log4j-api-2.x.jar
  • log4j-core-2.x.jar
  • log4j-jcl-2.x.jar

 

在开发阶段,始终使用Commons Logging接口来写入日志,并且开发阶段无需引入Log4j。如果需要把日志写入文件, 只需要把正确的配置文件和Log4j相关的jar包放入classpath,就可以自动把日志切换成使用Log4j写入,无需修改任何代码。例如:

package com.itranswarp.learnjava;import java.io.UnsupportedEncodingException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;public class Main {static final Log log = LogFactory.getLog(Main.class);//未被任何变量引用的日志记录器可能会被垃圾回收,故用静态变量存储日志记录器的引用public static void main(String[] args) {log.info("Start process...");try {"".getBytes("invalidCharsetName");} catch (UnsupportedEncodingException e) {log.error("Invalid encoding.", e);}log.info("Process end.");}
}
  •  
http://www.lbrq.cn/news/1349083.html

相关文章:

  • 东莞做外贸网站公司/百度一下官方网页
  • 网民深度参与政府网站建设/西安百度推广联系方式
  • 做网站西安哪家好/搜索引擎营销推广方案
  • 推广方式的英文/深圳百度推广优化
  • 韩国男女做游戏视频网站/搜索引擎营销的概念及特点
  • lol小米和谁做的视频网站/长春网站建设解决方案
  • 餐饮公司加盟网站建设/免费制作网站平台
  • 营销型网站设计难不难/seo推广论坛
  • 网站服务器速度查询/以品牌推广为目的的广告网络平台
  • 做网站的要到处跑吗/百度推广代理公司哪家好
  • 淄博什么兼职的网站建设/怎么创建一个自己的网站
  • 网站配色 蓝色/seo技巧seo排名优化
  • ps做网站一般用多大字体/成crm软件
  • sql2008做查询网站/如何做好网上销售
  • 万网是干什么用的/如何优化网站推广
  • 凡客诚品官网的关闭原因/关键词优化难度分析
  • 网站空间运行挂机宝/网络推广计划书
  • 如何做旅游网站推广/沈阳seo关键词排名
  • 企信网企业信用信息系统贵州/南京seo推广优化
  • 网站开发教程 视频教程/营销策略ppt模板
  • 网站建设psd模板/百度人工服务24小时热线电话
  • 网站的广告语应该怎么做/石家庄百度seo代理
  • 视频网站 做综艺 电视台/长沙seo公司
  • 正方教务管理系统入口/网站排名优化化快排优化
  • 微网站素材/关键词优化包含
  • 电子商务网站设计与实现论文/百度指数搜索
  • 怎么在记事本上做网站/专业网站快速
  • 黄页88可信吗/seo外链招聘
  • 如何建设运输网站/雏鸟app网站推广
  • 肥城网站建设公司/关键词指数批量查询
  • FluentUI-main的详解
  • 树莓派安装OpenCV环境
  • 大数据存储域——HDFS存储系统
  • MATLAB深度学习之数据集-数据库构建方法详解
  • 【Excel】通过Index函数向下拖动单元格并【重复引用/循环引用】数据源
  • 并发编程常用工具类(下):CyclicBarrier 与 Phaser 的协同应用