有时候我们的服务是以SDK的方式提供给外围使用。如果SDK需要打印业务日志进行排查的话,需要业务使用方配置log4j,这样使用起来相当不友好。而且很容易忽略这一块的配置,导致上线之后务日志可进行排查。

比如我们使用的中间件zdal, 会自动在服务器打印一下日志,无需我们感知。

我们可以通过log4j 的API方式实现服务启动自动创建监控日志:

/*** Alipay.com Inc.* Copyright (c) 2004-2015 All Rights Reserved.*/
package com.alipay.ap.prodintl.common.log;import java.io.File;
import java.io.IOException;import org.apache.log4j.Appender;
import org.apache.log4j.DailyRollingFileAppender;
import org.apache.log4j.Level;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;
import org.apache.log4j.spi.LoggerRepository;
import org.springframework.beans.factory.InitializingBean;/*** SDK客户端日志配置* * @author baoxing.gbx* @version $Id: ClientLogger.java, v 0.1 2015年7月30日 下午9:05:57 baoxing.gbx Exp $*/
public class ClientLogger implements InitializingBean {/** 系统SAL层(调用外部系统服务)摘要日志 */public static final Logger  APPRODINTL_SAL_DIGEST     = Logger.getLogger(LoggerNames.APPRODINTL_SAL_DIGEST);/** 系统SERVICE层(外围系统调用本系统服务)摘要日志 */public static final Logger  APPRODINTL_SERVICE_DIGEST = Logger.getLogger(LoggerNames.APPRODINTL_SERVICE_DIGEST);/** 系统业务日志 */public static final Logger  APPRODINTL_BUSINESS       = Logger.getLogger(LoggerNames.APPRODINTL_BUSINESS);/** 错误APPENDER */private static final String ERROR_APPENDER            = "ERROR-APPENDER";/** 控制台的appender */private static final String CONSOLE_APPENDER          = "CONSOLE";private static final String LogPath                   = "logs";/** 应用名称 */private String              appName;/** 日志级别  */private String              logLevel;/** 分隔符 */public final static String  SEPARATOR                 = ",";/** 日志参数 */public final static String  DAY_DATE_PATTERN          = "'.'yyyy-MM-dd";public final static String  DAY_DATE_DIAGEST_PATTERN  = "'.'yyyy-MM-dd_HH";public final static String  LAYOUT_PATTERN            = "%d [%t] - %m%n";public final static String  DAILY_APPENDER_NAME       = "_DAILY_APPENDER_NAME";public final static String  CONVERSION_PATTERN        = "%d %-5p %m%n";/** * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()*/@Overridepublic void afterPropertiesSet() throws Exception {initLog(LoggerNames.APPRODINTL_SERVICE_DIGEST_NAME, APPRODINTL_SERVICE_DIGEST);initLog(LoggerNames.APPRODINTL_SAL_DIGEST_NAME, APPRODINTL_SAL_DIGEST);initLog(LoggerNames.APPRODINTL_BUSINESS_NAME, APPRODINTL_BUSINESS);}/*** 初始化Appender并关联到对应Logger* * @param logFileName*          日志文件名称* @param logger*          Logger*/private void initLog(String logFileName, Logger logger) {LoggerRepository repository = LogManager.getLoggerRepository();//初始化错误日志appenderDailyRollingFileAppender errorAppender = getErrorAppender(repository);//初始化监控日志appenderDailyRollingFileAppender monitorAppender = getMonitorAppender(repository, logFileName);//初始化控制台日志appenderAppender consoleAppender = getConsoleAppender(repository);// 获取日志级别logger.setLevel(Level.toLevel(this.logLevel));if (monitorAppender != null) {logger.addAppender(monitorAppender);logger.addAppender(errorAppender);}//如果控制台的appender配置,添加if (consoleAppender != null) {logger.addAppender(consoleAppender);}logger.setAdditivity(false);}/*** 获取错误日志appender* * @param repository* @return*/private Appender getConsoleAppender(LoggerRepository repository) {return repository.getRootLogger().getAppender(CONSOLE_APPENDER);}/*** 获取监控日志appender* * @param repository* @param logFileName* @return*/private DailyRollingFileAppender getMonitorAppender(LoggerRepository repository,String logFileName) {PatternLayout layout = new PatternLayout(LAYOUT_PATTERN);layout.setConversionPattern(CONVERSION_PATTERN);DailyRollingFileAppender monitorAppender = null;//日志文件目录String path = getLogFilePath();File dir = new File(path);if (!dir.exists()) {dir.mkdirs();}//完整日志文件路径String fullLogFileName = path + logFileName;try {// 文件String rollingDatePattern = DAY_DATE_PATTERN;monitorAppender = new DailyRollingFileAppender(layout, fullLogFileName,rollingDatePattern);monitorAppender.setAppend(true);monitorAppender.setEncoding("UTF-8");monitorAppender.setName(DAILY_APPENDER_NAME);} catch (IOException e) {throw new RuntimeException(e);}return monitorAppender;}/*** 获取控制台日志appender* * @param repository* @return*/private DailyRollingFileAppender getErrorAppender(LoggerRepository repository) {return (DailyRollingFileAppender) repository.getRootLogger().getAppender(ERROR_APPENDER);}/*** 构造日志文件目录* * @return 日志文件目录*/private String getLogFilePath() {String userHome = System.getProperty("user.home");if (!userHome.endsWith(File.separator)) {userHome += File.separator;}return userHome + LogPath + File.separator + this.appName + File.separator;}/*** Setter method for property <tt>appName</tt>.* * @param appName value to be assigned to property appName*/public void setAppName(String appName) {this.appName = appName;}/*** Setter method for property <tt>logLevel</tt>.* * @param logLevel value to be assigned to property logLevel*/public void setLogLevel(String logLevel) {this.logLevel = logLevel;}}

  

如何实现服务器启动自动创建日志相关推荐

  1. spring boot所打的jar在服务器启动时,日志打印时间、jar所使用时间和系统当前时间不一致

    1.spring boot所打的jar在服务器启动时,日志打印时间.jar所使用时间和系统当前时间不一致 1)系统时间 2)日志打印时间 2.解决方法 在启动的时间添加-Duser.timezone= ...

  2. java写文件 自动创建目录吗_Java 自动创建日志目录及文件

    自己写一个批处理文件,并定时执行批处理文件 需求:每一天定时生成日志文件目录及文件 1.准备 在 E:\code 目录下有一个自己写的根据系统时间作为参数的一部分创建需求目录和文件的 Java 文件 ...

  3. 服务器会自动创建cookie,网站的cookie机制是什么

    cookie与session应用于互联网中的一项基本技术--会话(用户与客户端的交互)跟踪技术,用来跟踪用户的整个会话.简单来说,cookie是通过在客户端记录信息确定用户身份的,而session则通 ...

  4. 服务器启动时创建文件夹,技术|entr:文件更改时重新运行构建

    这是一篇简短的文章.我是最近才发现 entr 的,我很惊奇从来没有人告诉过我?!因此,如果你和我一样,那么我告诉你它是什么. entr 的网站上对它已经有很好的解释,也有很多示例. 总结在其头部:en ...

  5. elasticsearch服务器定时自动清理日志索引

    突然想到项目中每天要生产各个环境的索引...时间一长会越来越多. 这里写一个定时自动清理elasticsearch的脚本 首先.我们进入到elasticsearch的索引目录中去   发现索引数据是真 ...

  6. netty源码分析服务器启动 NioEventLoop创建

    2019独角兽企业重金招聘Python工程师标准>>> EventLoopGroup bossGroup = new NioEventLoopGroup(1); EventLoopG ...

  7. IIS服务器网站自动创建并部署

    color 6 echo "正在解压服务端资源..." %RAR_ROOT%\rar.exe x -y Unicode_HY.rar * echo "服务端资源解压完成& ...

  8. 拨号云服务器怎么自动配置网关_教你在阿里云创建增强型云网关

    Hello,大家好,今天我们聊的话题依旧和云有关,本期的主角是阿里云.阿里云创立于2009年,是全球领先的云计算及人工智能科技公司,致力于以在线公共服务的方式,提供安全.可靠的计算和数据处理能力,让计 ...

  9. 我的docker随笔15:MySQL启动时自动创建数据库

    一.背景及分析 MySQL容器启动时,会自动创建一些必要的数据库,比如MySQL,这是官方默认的做法.但是,在实际中,还需要让MySQL自动创建我们自定义的数据库.本文就此应用场合进行探究. 一般的做 ...

  10. Redis 中的 持久化 RDB持久化 SAVE:阻塞服务器并创建RDB文件 BGSAVE:以非阻塞方式创建RDB文件 通过配置选项自动创建RDB文件

    这里写目录标题 15.1 RDB持久化 15.1.1 SAVE:阻塞服务器并创建RDB文件 其他信息 15.1.2 BGSAVE:以非阻塞方式创建RDB文件 其他信息 15.1.3 通过配置选项自动创 ...

最新文章

  1. two years in cnblogs.com
  2. tinyMce在线编辑器内JavaScript实现按Ctrl+S无刷新保存
  3. JAVA——HttpClient封装工具类
  4. 在C语言的函数后标注small,大佬在吗,我用C写了一个去多重括号的函数,结果。。。...
  5. ​shell中经常能看到的:/dev/null 21
  6. SQL Server 使用OPENROWSET访问ORACLE遇到的各种坑总结
  7. 应届生去软通动力怎么样_超强干货:应届生如何找实习工作?
  8. 如何使用ITEXTSHARP将HTML代码字符串写进PDF
  9. loadrunner 字符集与检查点的探讨
  10. 数学建模LaTeX入门
  11. Flash 0day漏洞(CVE-2018-5002)千万不要乱打开Excel文档!
  12. 计算机系统是日语,如何在计算机系统中添加日语输入法
  13. 笑cry!在镜子面前,沉稳暖心的金毛同学也会瞬间化身逗比!
  14. 《写给大家看的设计书》《写给大家看的色彩书》《点石成金》《形式感》学习笔记...
  15. redis常用命令:
  16. 计算机量子化学计算焓,量子化学计算方法及应用.doc
  17. 联想天逸310-15ikb装固态内存和重装系统
  18. 将DAT格式视频文件转换成ASF和WMV格式视频文件
  19. JAVA面试题100道一
  20. 网页端对接linux发起cc,网页端和mLink指南

热门文章

  1. atitit.基于  Commons CLI 的命令行原理与 开发
  2. atitit.按钮光标滑过高亮切换以及其他动态效果的实现css html js --attilax总结
  3. atitit.软件开发概念--过滤和投影 数据操作
  4. paip. dsl 编程语言优点以及 常见的dsl
  5. paip.windows io监控总结
  6. 凌云一周看点 | 混合云多Region架构;云上用户定制化网络;边缘云全站加速;什么是操作系统的云原生...
  7. 7 年零故障支撑双 11,消息中间件 RocketMQ 如何做到?
  8. 三年磨一剑,钉的真好听 | 凌云时刻
  9. 【优化调度】基于matlab多目标粒子群算法求解风电光伏储能电网发电与需求响应调度优化问题【含Matlab源码 239期】
  10. 毕设题目:Matlab语音识别