• 分析info 日志
  • SimpleLog初始化
    • SimpleLog静态初始化
    • SimpleLog 构造初始化
      • 获取属性
    • SimpleLog 属性总结
  • 日志打印分析
    • 是否启用日志级别 isLevelEnabled
    • 打印日志
      • 打印
  • 控制台输出

分析info 日志

public class Main {public static void main(String[] args) {Log logger = LogFactory.getLog(Main.class);//**重点**logger.info("message");}
}

SimpleLog初始化

SimpleLog静态初始化

触发初始化的地方:
//org.apache.commons.logging.impl.LogFactoryImpl::createLogFromClass
c = Class.forName(logAdapterClassName, true, currentCL);

 // Initialize class attributes.// Load properties file, if found.// Override with system properties.static {// Add props from the resource simplelog.properties// 从simplelog.properties 载入属性到 simpleLogProps 中InputStream in = getResourceAsStream("simplelog.properties");if(null != in) {try {simpleLogProps.load(in);in.close();} catch(java.io.IOException e) {// ignored}}// static protected final String systemPrefix = "org.apache.commons.logging.simplelog.";// 是否显示日志:org.apache.commons.logging.simplelog.showlogname,  默认值:falseshowLogName = getBooleanProperty( systemPrefix + "showlogname", showLogName);// org.apache.commons.logging.simplelog.showShortLogname 是否显示短日志名称  默认值:trueshowShortName = getBooleanProperty( systemPrefix + "showShortLogname", showShortName);// org.apache.commons.logging.simplelog.showdatetime 是否显示时间 默认值:false showDateTime = getBooleanProperty( systemPrefix + "showdatetime", showDateTime);if(showDateTime) {//static protected final String DEFAULT_DATE_TIME_FORMAT = "yyyy/MM/dd HH:mm:ss:SSS zzz";//static protected String dateTimeFormat = DEFAULT_DATE_TIME_FORMAT;//org.apache.commons.logging.simplelog.dateTimeFormat 时间格式化, 默认值: yyyy/MM/dd HH:mm:ss:SSS zzzdateTimeFormat = getStringProperty(systemPrefix + "dateTimeFormat",dateTimeFormat);try {dateFormatter = new SimpleDateFormat(dateTimeFormat);} catch(IllegalArgumentException e) {// If the format pattern is invalid - use the default formatdateTimeFormat = DEFAULT_DATE_TIME_FORMAT;dateFormatter = new SimpleDateFormat(dateTimeFormat);}}}

SimpleLog 构造初始化

  public SimpleLog(String name) {logName = name;// Set initial log level// Used to be: set default log level to ERROR// IMHO it should be lower, but at least info ( costin ).//设置默认级别为 info setLevel(SimpleLog.LOG_LEVEL_INFO);
// static protected final String systemPrefix = "org.apache.commons.logging.simplelog.";// Set log level from properties//org.apache.commons.logging.simplelog.log.com.aya.MainString lvl = getStringProperty(systemPrefix + "log." + logName);int i = String.valueOf(name).lastIndexOf(".");// 遍历用户包:找到对应的日志级别//org.apache.commons.logging.simplelog.log.com.aya//org.apache.commons.logging.simplelog.log.comwhile(null == lvl && i > -1) {name = name.substring(0,i);lvl = getStringProperty(systemPrefix + "log." + name);i = String.valueOf(name).lastIndexOf(".");}// org.apache.commons.logging.simplelog.defaultlog 用户配置的默认级别if(null == lvl) {lvl =  getStringProperty(systemPrefix + "defaultlog");}if("all".equalsIgnoreCase(lvl)) {setLevel(SimpleLog.LOG_LEVEL_ALL);} else if("trace".equalsIgnoreCase(lvl)) {setLevel(SimpleLog.LOG_LEVEL_TRACE);} else if("debug".equalsIgnoreCase(lvl)) {setLevel(SimpleLog.LOG_LEVEL_DEBUG);} else if("info".equalsIgnoreCase(lvl)) {setLevel(SimpleLog.LOG_LEVEL_INFO);} else if("warn".equalsIgnoreCase(lvl)) {setLevel(SimpleLog.LOG_LEVEL_WARN);} else if("error".equalsIgnoreCase(lvl)) {setLevel(SimpleLog.LOG_LEVEL_ERROR);} else if("fatal".equalsIgnoreCase(lvl)) {setLevel(SimpleLog.LOG_LEVEL_FATAL);} else if("off".equalsIgnoreCase(lvl)) {setLevel(SimpleLog.LOG_LEVEL_OFF);}}

获取属性

  1. 从系统环境变量中获取,不为null就返回
  2. 从simpleLogProps 中获取(从simplelog.properties 载入的)
   private static String getStringProperty(String name) {String prop = null;try {prop = System.getProperty(name);} catch (SecurityException e) {; // Ignore}return (prop == null) ? simpleLogProps.getProperty(name) : prop;}

SimpleLog 属性总结

复制配置: https://blog.csdn.net/gxmark/article/details/7338253
新建配置文件:simplelog.properties

org.apache.commons.logging.simplelog.defaultlog=trace
org.apache.commons.logging.simplelog.log.XXXXXX=debug
org.apache.commons.logging.simplelog.showlogname=true
org.apache.commons.logging.simplelog.showShortLogname=true
org.apache.commons.logging.simplelog.showdatetime=true
org.apache.commons.logging.simplelog.dateTimeFormat=yyyy-MM-dd hh:mm:ss

日志打印分析

    public final void info(Object message) {if (isLevelEnabled(SimpleLog.LOG_LEVEL_INFO)) {log(SimpleLog.LOG_LEVEL_INFO,message,null);}}

是否启用日志级别 isLevelEnabled

    /*** Is the given log level currently enabled?** @param logLevel is this level enabled?*/protected boolean isLevelEnabled(int logLevel) {// log level are numerically ordered so can use simple numeric// comparison// 日志级别是否大于等于当前日志级别return (logLevel >= currentLogLevel);}

打印日志

  • 拼接日志内容

    • showDateTime(时间)
    • type(日志级别)
    • showShortName(用户类的简单名称)
    • t (异常信息)
  • 打印
 protected void log(int type, Object message, Throwable t) {// Use a string buffer for better performanceStringBuffer buf = new StringBuffer();// Append date-time if so configuredif(showDateTime) {Date now = new Date();String dateText;synchronized(dateFormatter) {dateText = dateFormatter.format(now);}buf.append(dateText);buf.append(" ");}// Append a readable representation of the log levelswitch(type) {case SimpleLog.LOG_LEVEL_TRACE: buf.append("[TRACE] "); break;case SimpleLog.LOG_LEVEL_DEBUG: buf.append("[DEBUG] "); break;case SimpleLog.LOG_LEVEL_INFO:  buf.append("[INFO] ");  break;case SimpleLog.LOG_LEVEL_WARN:  buf.append("[WARN] ");  break;case SimpleLog.LOG_LEVEL_ERROR: buf.append("[ERROR] "); break;case SimpleLog.LOG_LEVEL_FATAL: buf.append("[FATAL] "); break;}// Append the name of the log instance if so configuredif( showShortName) {if( shortLogName==null ) {// Cut all but the last component of the name for both stylesshortLogName = logName.substring(logName.lastIndexOf(".") + 1);shortLogName =shortLogName.substring(shortLogName.lastIndexOf("/") + 1);}buf.append(String.valueOf(shortLogName)).append(" - ");} else if(showLogName) {buf.append(String.valueOf(logName)).append(" - ");}// Append the messagebuf.append(String.valueOf(message));// Append stack trace if not nullif(t != null) {buf.append(" <");buf.append(t.toString());buf.append(">");java.io.StringWriter sw= new java.io.StringWriter(1024);java.io.PrintWriter pw= new java.io.PrintWriter(sw);t.printStackTrace(pw);pw.close();buf.append(sw.toString());}// Print to the appropriate destinationwrite(buf);}

打印

    protected void write(StringBuffer buffer) {// 系统错误输出System.err.println(buffer.toString());}

控制台输出

2018-06-19 04:37:01 [INFO] Main - message

commons-logging 分析之: org.apache.commons.logging.impl.SimpleLog相关推荐

  1. SLF4JLogFactory does not implement org.apache.commons.logging.LogFactory

    org.apache.commons.discovery.DiscoveryException: Class org.apache.commons.logging.impl.SLF4JLogFacto ...

  2. Apache Commons Collections反序列化漏洞分析与复现

     聚焦源代码安全,网罗国内外最新资讯! 1.1 状态 完成漏洞挖掘条件分析.漏洞复现. 1.2 漏洞分析 存在安全缺陷的版本:Apache Commons Collections3.2.1以下,[JD ...

  3. Apache Commons组件集合

    Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.我选了一些比较常用的项目做简单介绍.文中用了很多网上现成的东西,我只是做了一个汇总整理. 一.Comm ...

  4. Apache Commons工具集简介

    文章出处 Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.下面是我这几年做开发过程中自己用过的工具类做简单介绍. 组件 功能介绍 BeanUtils ...

  5. apache commons常用工具类

    1.有些情况下,Arrays满足不到你对数组的操作?不要紧,ArrayUtils帮你 ArrayUtils public class TestMain {  public static void ma ...

  6. Apache工具库——Apache Commons的使用

    Apache Commons是Apache开源的一个java组件库,其中包含了大量子项目,其中常用的组件有: 组件 功能介绍 BeanUtils 提供了对于JavaBean进行各种操作,克隆对象,属性 ...

  7. Apache Commons 工具类介绍及简单使用(转)

    转自:http://www.cnblogs.com/younggun/p/3247261.html Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.下 ...

  8. 一篇关于apache commons类库的详解

    1.1. 开篇 在Java的世界,有很多(成千上万)开源的框架,有成功的,也有不那么成功的,有声名显赫的,也有默默无闻的.在我看来,成功而默默无闻的那些框架值得我们格外的尊敬和关注,Jakarta C ...

  9. Apache Commons 工具类介绍及简单使用

    Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.下面是我这几年做开发过程中自己用过的工具类做简单介绍. 组件 功能介绍 BeanUtils 提供了对于 ...

最新文章

  1. c语言递归求五阶行列式源代码,久游堂怎么样 -官网
  2. c 语言中下标运算符,详解C++中二进制求补运算符与下标运算符的用法
  3. EXP的flashback_scn和flashback_time
  4. NeHe OpenGL教程 第二十一课:线的游戏
  5. 【暑假训练 7.10】 codevs 2492 上帝造题的七分钟2
  6. Linux上线程开发API概要(线程)
  7. 为什么有些大公司的效率弱爆了?
  8. redis持久化、内存优化、过期、LRU内存
  9. iOS 设计模式之抽象工厂
  10. 从零开始刷Leetcode——数组(896.905.914.922)
  11. 7-2 玩转二叉树 (25分)_2-1!72分钟绝杀!西乙黑马踢疯了,西班牙人+武磊却迎利好...
  12. 使用Java语言借助Quartz jar包实现定时器的方法
  13. 锐捷校园网拨号上网一号多用
  14. Silverlight下载-Silverlight 1.1 Tools下载
  15. 如何用工具自动修复数字IC后端设计实现绕线后的Physical DRC_
  16. html5 窗口 最小化,HTML5 窗口最小化动画(先压扁后变窄)
  17. 使用JavaScript进行销毁:操作指南
  18. 如何快速书写文件的相对路径和绝对路径
  19. 写一个Singleton模式的例子
  20. 国标流媒体服务器以ROOT身份运行提示“permission denide”报错解决

热门文章

  1. 人工智能行业博士研究生学术科研及工作就业规划经验分享
  2. 年营收相差一半,华为凭什么和苹果比?
  3. 一个月能让“蚊子”“蟑螂”绝子绝孙的秘诀(组图)
  4. 如何绘制使用组织结构图
  5. kalinux2020安装失败_kalinux安装,虚拟机图文详细安装教程
  6. 阿里云服务器实例怎么选?根据业务场景选择实例参考
  7. oracle12c客户端安装配置,Oracle 12.2简易客户端安装配置
  8. 关于腾讯云server使用FTP具体配置教程
  9. 前端(Vue)怎么实现二维码生成
  10. i9 12900k和r9 5900x哪个好