精华内容
下载资源
问答
  • 下面我列举实践中遇到的一些问题:已有门面存在问题log对象创建比较复杂很多时候我们为了在类中加日志不得写一行,而且还要去手动改XXX这个类名privatestaticfinalLoggerlog=LoggerFactory.getLog...

    Log模块概述

    由来

    准确的说,Hutool-log只是一个日志的通用门面,功能类似于Slf4j。既然像Slf4j这种门面框架已经非常完善,为何还要自己做一个门面呢?下面我列举实践中遇到的一些问题:

    已有门面存在问题log对象创建比较复杂很多时候我们为了在类中加日志不得不写一行,而且还要去手动改XXX这个类名

    privatestaticfinalLoggerlog=LoggerFactory.getLogger(XXX.class);

    对于附带Exception参数的方法,并不支持变量。Slf4j中我最喜欢的形式,这样既省去了麻烦的isInfoEnabled()的判断,还避免了拼接字符串:

    log.info("我在XXX 改了 {} 变量","name");

    但是这种情况下就无法使用变量模式:

    log.error("错误消息",e);

    特点Logfactory.get方法不再需要(或者不是必须)传入当前类名,会自定解析当前类名

    log.xxx方法在传入Exception时同时支持模板语法。

    不需要桥接包而自动适配引入的日志框架,在无日志框架下依旧可以完美适配JDK Logging。

    引入多个日志框架情况下,可以自定义日志框架输出。

    原理

    Hutool-log采用动态自动适配模式,它会自动检测引入的日志框架包从而将日志输出到此框架。比如我们在项目中引入Log4j的包,Hutool-log会自动检测到此包的存在,并将日志输出到log4j。如果没有引入任何日志框架,会将日志输出到JDK Logging中。

    因此,Hutool-log并没有统一的配置文件,如果你引入任何一种日志框架,使用此框架的配置文件即可。

    Hutool-log对于日志框架的监测顺序是:Slf4j(Logback) > Log4j > Log4j2 > Apache Commons Logging > JDK Logging > Console

    当然,如果只是引入Slf4j-API,而没有引入任何实现,Slf4j将被跳过。

    关于日志框架监测的核心代码请参阅:LogFactory.create

    使用

    常规使用

    Hutool-log的使用与一般日志框架并无区别,调用LogFactory.get()即可简单获取Log实现对象。

    Loglog=LogFactory.get();

    log.debug("This is {} log",Level.DEBUG);

    log.info("This is {} log",Level.INFO);

    log.warn("This is {} log",Level.WARN);

    Exceptione=newException("test Exception");

    log.error(e,"This is {} log",Level.ERROR);

    通常我们需要在类中定义日志为private static final Log log = LogFactory.get();以获得更好的性能。

    自定义日志实现

    有的时候,我们需要自定义日志框架输出,这是我们就需要调用LogFactory.setCurrentLogFactory方法来定义全局的日志实现。

    // 自动选择日志实现

    Loglog=LogFactory.get();

    log.debug("This is {} log","default");

    Console.log("----------------------------------------------------------------------");

    //自定义日志实现为Apache Commons Logging

    LogFactory.setCurrentLogFactory(newApacheCommonsLogFactory());

    log.debug("This is {} log","custom apache commons logging");

    Console.log("----------------------------------------------------------------------");

    //自定义日志实现为JDK Logging

    LogFactory.setCurrentLogFactory(newJdkLogFactory());

    log.info("This is {} log","custom jdk logging");

    Console.log("----------------------------------------------------------------------");

    //自定义日志实现为Console Logging

    LogFactory.setCurrentLogFactory(newConsoleLogFactory());

    log.info("This is {} log","custom Console");

    Console.log("----------------------------------------------------------------------");

    默认的,在未发现任何第三方日志的情况下,检查logging.properties文件是否在classpath中存在(鉴定用户是否想用JDK Logging),如果没有这个配置文件,默认是按照Hutool预定义规则打印到控制台。

    展开全文
  • Hutool-log使用文档1....下面我列举实践中遇到的一些问题:已有门面存在问题log对象创建比较复杂很多时候我们为了在类中加日志不得写一行,而且还要去手动改XXX这个类名private static final Logger log = Log...

    Hutool-log使用文档

    1.概述

    由来

    准确的说,Hutool-log只是一个日志的通用门面,功能类似于Slf4j。既然像Slf4j这种门面框架已经非常完善,为何还要自己做一个门面呢?下面我列举实践中遇到的一些问题:

    已有门面存在问题

    log对象创建比较复杂

    很多时候我们为了在类中加日志不得不写一行,而且还要去手动改XXX这个类名

    private static final Logger log = LoggerFactory.getLogger(XXX.class);

    2.对于附带Exception参数的方法,并不支持变量。

    Slf4j中我最喜欢的形式,这样既省去了麻烦的isInfoEnabled()的判断,还避免了拼接字符串:

    log.info("我在XXX 改了 {} 变量", "name");

    但是这种情况下就无法使用变量模式:

    log.error("错误消息", e);

    特点

    Logfactory.get方法不再需要(或者不是必须)传入当前类名,会自动解析当前类名

    log.xxx方法在传入Exception时同时支持模板语法。

    不需要桥接包而自动适配引入的日志框架,在无日志框架下依旧可以完美适配JDK Logging。

    引入多个日志框架情况下,可以自定义日志框架输出。

    原理

    Hutool-log采用动态自动适配模式,它会自动检测引入的日志框架包从而将日志输出到此框架。 比如我们在项目中引入Log4j的包,Hutool-log会自动检测到此包的存在,并将日志输出到log4j。如果没有引入任何日志框架,会将日志输出到JDK Logging中。

    因此,Hutool-log并没有统一的配置文件,如果你引入任何一种日志框架,使用此框架的配置文件即可。

    Hutool-log对于日志框架的监测顺序是: Slf4j(Logback) > Log4j > Log4j2 > Apache Commons Logging > JDK Logging > Console

    当然,如果只是引入Slf4j-API,而没有引入任何实现,Slf4j将被跳过。

    关于日志框架监测的核心代码请参阅:LogFactory.create

    使用

    常规使用

    Hutool-log的使用与一般日志框架并无区别,调用LogFactory.get()即可简单获取Log实现对象。

    Log log = LogFactory.get();

    log.debug("This is {} log", Level.DEBUG);

    log.info("This is {} log", Level.INFO);

    log.warn("This is {} log", Level.WARN);

    Exception e = new Exception("test Exception");

    log.error(e, "This is {} log", Level.ERROR);

    通常我们需要在类中定义日志为private static final Log log = LogFactory.get();以获得更好的性能。

    自定义日志实现

    有的时候,我们需要自定义日志框架输出,这是我们就需要调用LogFactory.setCurrentLogFactory方法来定义全局的日志实现。

    // 自动选择日志实现

    Log log = LogFactory.get();

    log.debug("This is {} log", "default");

    Console.log("----------------------------------------------------------------------");

    //自定义日志实现为Apache Commons Logging

    LogFactory.setCurrentLogFactory(new ApacheCommonsLogFactory());

    log.debug("This is {} log", "custom apache commons logging");

    Console.log("----------------------------------------------------------------------");

    //自定义日志实现为JDK Logging

    LogFactory.setCurrentLogFactory(new JdkLogFactory());

    log.info("This is {} log", "custom jdk logging");

    Console.log("----------------------------------------------------------------------");

    //自定义日志实现为Console Logging

    LogFactory.setCurrentLogFactory(new ConsoleLogFactory());

    log.info("This is {} log", "custom Console");

    Console.log("----------------------------------------------------------------------");

    默认的,在未发现任何第三方日志的情况下,检查logging.properties文件是否在classpath中存在(鉴定用户是否想用JDK Logging),如果没有这个配置文件,默认是按照Hutool预定义规则打印到控制台。

    2.日志工厂-LogFactory

    介绍

    Hutool-log做为一个日志门面,为了兼容各大日志框架,一个用于自动创建日志对象的日志工厂类必不可少。

    LogFactory类用于灵活的创建日志对象,通过static方法创建我们需要的日志,主要功能如下:

    LogFactory.get 自动识别引入的日志框架,从而创建对应日志框架的门面Log对象(此方法创建一次后,下次再次get会根据传入类名缓存Log对象,对于每个类,Log对象都是单例的),同时自动识别当前类,将当前类做为类名传入日志框架。

    LogFactory.createLog 与get方法作用类似。但是此方法调用后会每次创建一个新的Log对象。

    LogFactory.setCurrentLogFactory 自定义当前日志门面的日志实现类。当引入多个日志框架时,我们希望自定义所用的日志框架,调用此方法即可。需要注意的是,此方法为全局方法,在获取Log对象前只调用一次即可。

    使用

    获取当前类对应的Log对象:

    //推荐创建不可变静态类成员变量

    private static final Log log = LogFactory.get();

    如果你想获得自定义name的Log对象(像普通Log日志实现一样),那么可以使用如下方式获取Log:

    private static final Log log = LogFactory.get("我是一个自定义日志名");

    自定义日志实现

    //自定义日志实现为Apache Commons Logging

    LogFactory.setCurrentLogFactory(new ApacheCommonsLogFactory());

    //自定义日志实现为JDK Logging

    LogFactory.setCurrentLogFactory(new JdkLogFactory());

    //自定义日志实现为Console Logging

    LogFactory.setCurrentLogFactory(new ConsoleLogFactory());

    LogFactory是一个抽象类,我们可以继承此类,实现createLog方法即可(同时我们可能需要实现Log接口来达到自定义门面的目的),这样我们就可以自定义一个日志门面。最后通过LogFactory.setCurrentLogFactory方法装入这个自定义LogFactory即可实现自定义日志门面。

    PS 自定义日志门面的实现可以参考cn.hutool.log.dialect包中的实现内容自定义扩展。 本质上,实现Log接口,做一个日志实现的Wrapper,然后在相应的工厂类中创建此Log实例即可。同时,LogFactory中还可以初始化一些启动配置参数。

    3.静态调用日志-StaticLog

    由来

    很多时候,我们只是想简简单的使用日志,最好一个方法搞定,我也不想创建Log对象,那么StaticLog或许是你需要的。

    使用

    StaticLog.info("This is static {} log.", "INFO");

    同样StaticLog提供了trace、debug、info、warn、error方法,提供变量占位符支持,使项目中日志的使用简单到没朋友。

    StaticLog类中同样提供log方法,可能在极致简洁的状况下,提供非常棒的灵活性(打印日志等级由level参数决定)

    与LogFactory同名方法

    假如你只知道StaticLog,不知道LogFactory怎么办?Hutool非常贴心的提供了get方法,此方法与Logfactory中的get方法一样,同样可以获得Log对象。

    4.疑惑解答

    问:

    程序中出现[WARN] Can not find [logging.properties], use [%JRE_HOME%/lib/logging.properties] as default!这行警告,请问这个问题如何解决?

    答:

    这是因为你没有引入任何第三方日志框架。Hutool默认会使用JDK Logging做为其日志实现。出现这句话的意思是你没有在你的ClassPath下放logging.properties(JDK Logging的配置文件),系统默认默认读取JDK目录下的默认配置文件。你可以考虑在ClassPath下放一个logging.properties(就是src/main/resources)下。

    注意 在新版的Hutool中会自动检测logging.properties存在与否,如果不存在这个配置文件,将跳过JDK-Logging从而使用Console-log(命令行打印日志)

    展开全文
  • Nginx产生的日志都是存在一个文件,随着网站运行时间越长,日志文件的大小也在不断增长,这对我们想分析当天日志非常的方便,所以需要每天把日志文件分割出来,并以时间命名。 创建日志分割脚本 vim cut_logs.sh...

    Nginx产生的日志都是存在一个文件,随着网站运行时间越长,日志文件的大小也在不断增长,这对我们想分析当天日志非常的不方便,所以需要每天把日志文件分割出来,并以时间命名。

    创建日志分割脚本

    vim cut_logs.sh 
     
    #!/bin/bash
    # The Nginx logs path
    logs_path="/var/log/nginx/"
    mkdir -p ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/
    mv ${logs_path}access.log ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/showself_$(date -d "yesterday" +"%Y%m%d").log
    kill -USR1 $(cat /var/run/nginx.pid)
     
    chmod +x cut_logs.sh

    设置cut_logs.sh启动时间

    执行命令crontab -e进入编辑状态
    添加如下代码,每天0点01分启动。

    设置cut_logs.sh启动时间

    执行命令crontab -e进入编辑状态
    添加如下代码,每天0点01分启动。

     01 00 * * * cut_logs.sh

     

     

     

    展开全文
  • docker 打印出来日志与服务器时间一致 解决办法:echo 'Asia/Shanghai' >/etc/timezone #宿主机和容器时间相查8个小时 #宿主机采用CST时区,CST是指China Shanghai Time,东八区时间 #容器采用UTC时区,UTC...

    docker的时间与宿主机是一致的

    docker 打印出来的日志与服务器时间不一致

    解决办法:echo 'Asia/Shanghai' >/etc/timezone 

    #宿主机和容器时间相查8个小时
    #宿主机采用CST时区,CST是指China Shanghai Time,东八区时间
    #容器采用UTC时区,UTC应该是指Coordinated Universal Time,标准时间
           统一两者的时区有下面几种方法
    1、共享主机的localtime


    #创建容器的时候指定启动参数,挂载localtime文件到容器内,保证两者所采用的时区是一致的。
    docker run -it -d --name web -v /etc/localtime:/etc/localtime:ro centos:1.0 /bin/bash
    2、复制主机的localtime

    docker cp /etc/localtime 753f856bca45:/etc/
    3、创建dockerfile文件的时,自定义该镜像的时间格式及时区。在dockerfile文件里添加下面内容:
    #设置时区
    RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
            保存后,利用docker build命令生成镜像使用即可,使用dockerfile创建的镜像的容器改变了容器的时区,这样不仅保证了容器时间与宿主机时间一致(假如宿主机也是CST),并且像上面使用tomcat作为父镜像的话,JVM的时区也是CST,这样tomcat的日志信息的时间也是和宿主机一致的,像上面那两种方式只是保证了宿主机时间与容器时间一致,JVM的时区并没有改变,tomcat日志的打印时间依旧是UTC。

     

    - /usr/share/zoneinfo/Asia/Shanghai:/usr/share/zoneinfo/Asia/Shanghai:ro  
                      - /etc/localtime:/etc/localtime:ro


              command: ["/bin/bash","-c","touch /etc/timezone&&echo 'Asia/Shanghai' > /etc/timezone && /apps/start.sh"] 

    展开全文
  • 模块的init main configuration阶段时,用到的ngx_cycle是main函数的init_cycle(旧的),在main中init_cycle中会创建新的ngx_cycle, 之后再main中把新的cycle赋值给ngx_cycle全局变量。 而在initmain时,用的是旧的...
  • 作者:Sharehub来源:blog.xiaohansong.com/java-log-confict-solve.html前言Java 有很多的日志框架可以选择,当同一个项目中出现多种日志框架时就很容易出现日志框架冲突的问题,导致日志打印不出来。本文将以一次...
  • 这个感觉就是日志目录创建不了,肯定是哪里权限不足导致的,但是当创建好之后,赋予权限的时候还是不可以,然后重新装了好多次,还是一直报这个错。最后在装的时候发现,目录的创建的时候要指定一个目录,当时没截图...
  • 在android4.0及4.1这两个版本中,我们可以操作内置内存卡(4.4是可以的),但是可以一步到位创建文件完毕 如:File file = new File(Environment.getExternalStorageDirectory().getPath() + "/Test/test/1.txt...
  • Mysql服务起来,错误日志里也没有报错信息 昨晚在测试canal连接mysql数据库,但是一直...当时我和DBA大哥看的时候只有一些无关紧要的日志,关于启动的错误日志是一点没有体现出来。当场裂开… 2.查看mysql的 my.in
  • 在spring cloud的feign服务间调用时,有时候有一些想象到的问题,就需要看一下具体的请求内容 1、创建Feign配置文件 @Configuration public class FeignConfiguration { @Bean Logger.Level feignLoggerLevel() ...
  • 1.若使用logstash来做日志收集,logstash会根据事件传输的当前时间自动给事件加上@timestamp字段。...还是需要使用日志时间独立出来才更加方便查看。 2.创建索引模板 从kafka传输到logstash的日志如下: {"date":
  • 创建了一个Springboot项目,配置文件中的端口号是10000,运行后发现10000端口并没有显示且无法访问。于是启动另外一个端口为8000的项目,端口显示且能访问。我们对比两个应用启动的日志文件,发现8000端口的应用没有...
  • 今天在一台MYSQL服务器上发现,明明用了engine=innodb创建的表,结果创建出来却成了myisam的表。再看show variables like '%innodb%';have_innodb 成了DISABLED。经过一番试验,发现是我关闭数据库后,直接删除...
  • 安装完atlas后执行create table xxas select xx 语句测试创建血缘关系图,语句中使用的表都是刚创建的血缘关系会创建出来,过几分钟再用同样的语句创建另一张表,查看atlas发现没有血缘关系,使用其它已存在的表同样...
  • nginx日志分割

    2017-03-30 14:12:00
    nginx 产生的日志都是存在一个文件,随着网站运行时间越长,日志文件的大小也在不断增长,这对我们想分析当天日志非常的方便,所以需要每天把日志文件分割出来,并以时间命名。 创建日志分割脚本 1、登录SSH,...
  • 结果几个小时的努力,终于解决了这个问题 下面把我的解决办法分享出来(我是XP系统,如果你也是,不妨照我的步骤试试): 1.肯定要确保你的apache正常运行。写点代码测试一下,或者使用 <?...
  • 今天我的phpMyAdmin突然出现这个问题,在网上搜了好久的答案,差不多都是转载的,内容一模一样,全是复制粘贴,一点都仔细。结果几个小时的努力,终于解决了这个问题 下面把我的解决办法分享出来(我是XP系统,...
  • Shell没基础,但是需要实现nginx日志每日切割的效果,在网上找了一些照搬都没怎么成功,最后自己试验出来的才是真正能用的不是嘛参考文章:https://www.cnblogs.com/kaitu...1.在某目录下创建需要定时执行的脚本# cd...
  • 概述本文主要给大家介绍了关于Oracle 11g清理数据库历史日志的相关内容,分享出来供大家参考学习,下面话多说了,来一起看看详细的介绍创建存放数据库待删除日志文件路径用于存放准备删除,这里假设放在/home/...
  • 转载请注明出处:帘卷西风的专栏(http://blog.csdn.net/ljxfblog)  最近游戏开始第二次内测,开始处理操作日志,最开始把日志... 具体思路是写日志的时候,根据当前的时间决定插入到当天的表里面,如表存在则创建
  • 概述今天给大家介绍的是关于Linux配置日志服务器的相关内容,分享出来供大家参考学习,下面话多说了,来一起看看详细的介绍吧日志服务器配置文件:/etc/rsyslog.conf服务器端:服务器IP如下:编辑日志服务器的配置...
  • 概述本文主要给大家介绍了关于Oracle 11g清理数据库历史日志的相关内容,分享出来供大家参考学习,下面话多说了,来一起看看详细的介绍创建存放数据库待删除日志文件路径用于存放准备删除,这里假设放在/home/...
  • java编程时,经常需要记录一些信息,而将这些信息通过日志...logging自带的打印格式非常的友好,属于xml格式,通常,我们需要自定义我们自己的日志输出格式MyLogHander以方便阅读创建一个新的类MyLogHander,继...
  • 本文主要介绍的是关于Linux配置日志服务器的相关内容,分享出来供大家参考学习,下面话多说了,来一起看看详细的介绍吧 日志服务器配置文件:/etc/rsyslog.conf 服务器端: 服务器IP如下: 编辑日志服务器的配置...
  • jstack日志深入理解

    2020-04-22 21:16:11
    在分析线上问题时常使用到jstack <PID>命令将当时Java应用程序的线程堆栈dump出来。 面对jstack 日志,我们如何查看? 首先要清楚线程的状态 ...New: 当线程对象创建时存在的状态,此时线程可能执行; R...
  • 使用k8s Elasticsearch查看pod日志的时候偶尔会遇到这样的情况,在创建完容器并运行后去查看日志的时候总是加载不出来,需要等待十几秒甚至一分钟才能加载。我“有幸”被分配来解决这个问题,经过一天的努力终于发现...
  • Nginx产生的日志都是存在一个文件,网站运行时间越长,日志文件的大小也在不断增长,这对分析当天日志非常的方便,所以需要每天把日志文件分割出来,并以时间命名,产生的日志无限增长,终有一天会导致磁盘爆满,...
  • 子线程创建不出来猜测:go的程序都能创建出子线程,但是c++的创建不出来,但是在 x86 可以,是不是什么 linux 系统限制?解决方法:加错误日志进行调试(最 lower 办法)找到报错点:查询 man ...
  • 一个新的app发布后难免会遇到很多意外的问题,往往在测试的时候容易测试出来。这里介绍一个组件,腾讯的bugly。 傻瓜式集成,自动捕获崩溃异常并上传至平台上,并且提供基本的错误信息,和app基本信息,也支持...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 463
精华内容 185
关键字:

日志创建不出来