精华内容
下载资源
问答
  • Log4j2官方文档翻译--欢迎使用Log4j2!
    千次阅读
    2018-09-19 17:07:30

    官网原文标题《Welcome to Log4j 2!》

    官网原文地址http://logging.apache.org/log4j/2.x/manual/index.html

    译者:本文介绍了Log4j的发展历史。以及log4j2的特性。读者在学习log4j2前建议最先阅读此文

    后续阅读:《Log4j2官方文档翻译--架构》

    介绍

    几乎所有大型应用都有它自己的log或者tracing API。顺应这一规范,在1996年,E.U. SEMPER 项目也决定自己编写tracing API。在包含了许多典型实现和大量工作的无数次增强后,这个API被演化为log4j-一个流行的Java logging包。它发布在Apache Software License下,一个被开源精神证明的,完全成熟的开源license。最新版本的log4j,包含了完整的源代码,class文件及文档。你可以在 http://logging.apache.org/log4j/2.x/index.html找到它。

    为了便于调试,在代码中插入log的片段,是一个比较low的做法。但也可能是唯一的方法,因为调试器并不会一直可用或者适合。对于多线程的应用或者大型分布式应用更是如此。

    经验告诉我们,logging是开发周期中重要的组件。它可以提供很多的好处。它提供运行中程序精确的上下文信息。一旦你插入了log的代码,不需要人工介入就可以生成logging输出。更为重要的是,日志可以被持久化保存,以备日后研究。开发周期中,logging还有一个额外的作用,我们可以把它看作一个审计工具。

    就像 Brain W.kernighan和Rob Pike在他们《The practice of Programming》中所写到的:

    作为个人选择,我们在获取stack trace和一两个变量值以外,并不倾向于使用调试器。原因是它很容易把复杂的数据结构和控制流程搞丢;我们发现一步步debug和在重要的地方多思考、加入输出片段、自我检查代码比起来,并不是那么富有成效。查看合理位置的输出,和一次次点击debug比起来,会花费更少的时间。与在我们已知的关键代码单步调试比起来,找到正确的位置插入打印日志片段会更省时间。更为重要的是,调试的代码片段和代码在一起,但是debugging的会话是瞬时的。

    Logging也有它的缺点,它可以使得程序变慢。如果太冗长的话,它会造成滚动的盲区。为了缓解这些痛点,log4j被设计的可信赖、快速、可扩展。因为logging很少是程序关注的主要焦点,log4j的api努力变的简单易懂、易于使用。

     

    Log4j 2

    Log4j 1.x已经在很多应用中被使用了。然而,近年来它开发的脚步却变慢了。它变的越来越难以维护,由于它需要依存于老版本的Java。它于2015年8月,生命周期结束。它的其他选择,SLF4J/Logback做了很多的提升。那么为什么要操心log4j2呢?下面是一些原因:

     

    1、Log4j 2被设计为可以用作审计日志的框架。Log4j 1.x和Logback都会在重新配置时丢失日志。Logj 2不会这样。在Logback中,appender中的异常对于程序是不可见的。在log4j 2可以配置appender的异常渗透给应用。

    2、Log4j 2包含下一代基于LMAZ Disruptor library 的异步Logger。和Log4j 1及logback比起来,在多线程场景中,异步的logger有着10倍的生产量,以及量级下降的延迟。

    3、Log4j 2对于独立应用来说是无垃圾的,对于持续记日志的web应用,只产生很低的垃圾。这可以降低垃圾回收器的压力并且得到更好的响应性能。

    4、Log4j 2使用插拔系统,,使得通过加入新的appender、filter、layout、lookup来扩充框架,变得极为简单。因为不需要对log4j做任何改变。

    5、因为插件系统的配置十分简单。配置中的条目并不需要指明class名称。

    6、支持客制化的log level。客制化的log level可以写在代码里,也可以放到配置文件中

    7、支持lambda表达式。运行在java8上的代码可以使用lambda表达式懒构造log信息,如果请求的log level被启用。明确的level检查是不需要的,使用更为简洁的代码达到同样的效果。

    8、支持消息对象。消息可以支持有趣而复杂的结构通过log系统传递,并被高效的操作。用户可以自由的创建自己的Message类型及编写客制化的layout、filter、lookup来操作它们。

    9、Log4j 1.x支持appender中的filter。Logback加入了TurboFIlter来过滤event,在他们被logger处理前。Log4j 2支持可配置的filter来处理event,在被Logger处理前,它们被Logger或者appender所使用。

    10、很多Logback Appender不接受layout,只能输出固定的格式。大多数Log4j2 Appender接收layout,允许数据转化为任何想要的样式。

    11、Log4j 1.x及Logback中的Layout返回String,这会导致 Logback Encoders. 中讨论的问题。Log4j 2使用了简单的方法使得layout永远返回byte数组。这样的好处是,它可以被任何的appender所使用,并不只是写入到outputstream的appender。

    12 、Syslog appender支持TCP和UDP,也同样支持BSD syslog及RFC 5424 格式

    13、Log4j 2采用了Java5中并发支持的优势,并且尽可能的采用最低层级的锁。Log4j 1.x有已知的死锁问题。大部份问题虽然在logback中修复了,但是很多logback的类都需要在相当高的level来做同步。

    14、他是Apache Software Foundation项目,遵循了所有ASF项目所采用的社区及支持模式。如果你想要作出贡献并且赢得提交代码的权利,只需要按照Contributing里面的概述去做

     

    更多相关内容
  • 关于Log4j 1.x 升级Log4j 2.x 那些事

    千次阅读 2019-09-20 12:35:37
    log4j 1.x 升级log4j 2.x 踩坑攻略

    这篇博文来聊聊Log4j 1.x 升级到Log4j 2.x 后发生了改变。

    0x01 为什么要将Log4j 1.x升级到Log4j 2.x?

    我们知道由于 Log4j 1 代码库存在一些架构缺陷,因此 2015年8月 官方停止维护log4j 1.x

    当我们重新打开 Log4j 1.x 官网可以看到如下内容:
    在这里插入图片描述

    上面的英文大致意思说Log4j 1.x 已经停止维护,建议大家都去升级使用Log4j 2.x吧~

    既然官方都这么宣布了,那么我们一起来Log4j 2.x 官网看看吧。

    打开Log4j 2.x 官网,我们可以看到
    在这里插入图片描述
    如果看不懂的,这里大致翻译下:

    Apache Log4j 2是对Log4j的升级,它比其前身Log4j 1.x提供了重大改进,并提供了Logback中可用的许多改进,同时修复了Logback架构中的一些固有问题。

    关于 为什么要升级,我这里做下总结:

    • Log4j 1.x 和Logback 配置文件改动重新加载会导致丢失一些日志记录。
    • log4j2 基于LMAX Disruptor library 比Log4j1.x 和logback 快很多
    • Log4j 1代码库存在一些架构缺陷,因此2015年8月log4j 1.x 官方停止维护

    总之,我们知道如下几点就够了

    • log4j 2.x 比Log4j 1.x 和Logback 更好更优秀
    • log4j 2.x 接口和实现分离,log4j-api 模块是log4j2日志接口,log4j-core模块是log4j2日志实现。
    • log4j-api 日志接口比Slf4j API接口功能更强大

    log4j 2设计架构图
    在这里插入图片描述

    0x02 如何把Log4j 1.x 升级到log4j2.x ?

    好了说完了为什么升级,接下来我们聊聊如何升级的问题。

    你可能看的一头雾水,没关系,我们来看点比较实用的

    2.1 依赖升级篇

    官方Log4j 1.x 升级Log4j2.x升级参考文档

    关于这个依赖升级,下面这个图很重要。

    2.1.1 基础的依赖

    2.1.1.1 普通项目

    添加最基础的Log4j 2日志依赖如下:

       <!--https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api-->
      <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.12.1</version>
      </dependency>
      <!--https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core-->
      <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.12.1</version>
      </dependency>
    
    • 这里log4j-api是log4j2日志接口,log4j-core 是log4j2日志实现。
    • 查看最新版本

    2.1.1.2 Spring Boot 项目

    我们只需要如下添加如下依赖即可:

    <!--排除默认的logback日志-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-log4j2 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>
    

    注意事项

    • log4j-slf4j-impl 不能和log4j-to-slf4j同时使用
      • log4j-slf4j-impl 是SLF4J API 作为日志门面,
      • 然后通过该依赖适配成Log4j 2.x API(日志接口),最后交给Log4j 2.x core(impl 日志实现)
    • log4j-to-slf4j 则是将log4j 2.x API 转换成SLF4J API,最后交给SLF4J 实现类。

    2.1.2 统一版本依赖

    在项目中显示声明的依赖好处理,对于一些传递的依赖如果Log4j 的 版本不一致可能会警告或者错误提示。

    解决方法就是添加如下内容:

    <dependencyManagement>
      <dependencies>
        <dependency>
          <groupId>org.apache.logging.log4j</groupId>
          <artifactId>log4j-bom</artifactId>
          <version>2.12.1</version>
          <scope>import</scope>
          <type>pom</type>
        </dependency>
      </dependencies>
    </dependencyManagement>
    

    2.1.3 Log4j 1.x API Bridge

    如果是老项目,可能有很多代码是使用Log4j 1.x 的API进行的调用,全部更换成新代码无疑是一个头疼的事情。

    <dependencies>
      <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-1.2-api</artifactId>
        <version>2.12.1</version>
      </dependency>
    </dependencies>
    
    • 需要移除掉所有的之前的Log4j 1.x 相关依赖
    • 正如下图所示,添加以上依赖后就可以将log4j 1.x API与log4j 2.x API 之间做一个适配,最后交给log4j 2.x Core实现。
    • Log4j Runtime Dependencies
      在这里插入图片描述

    2.1.4 Apache Commons Logging Bridge

    如果项目之前是实用Commons Logging 作为门面日志,那么官方提供了一个连接桥

    <dependencies>
      <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-jcl</artifactId>
        <version>2.12.1</version>
      </dependency>
    </dependencies>
    
    • 不需要移除Common Logging 依赖
    • 正如下图所示,添加如上依赖后可以将 Common Logging API 适配成Log4j 2.x API ,然后交给log4j 2.x 实现类实现。
    • Log4j Runtime Dependencies
      在这里插入图片描述

    2.1.5 SLF4J Bridge

    如果我们不想要实用log4j-api 作为日志门面(日志接口),而是想用SLF4j 那么可以引入这个依赖。

    <dependencies>
      <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-slf4j-impl</artifactId>
        <version>2.12.1</version>
      </dependency>
    </dependencies>
    

    注意事项:

    • 不需要移除SLF4J-API 依赖
    • 本质上是 SLF4J 日志门面转Log4j 日志门面
    • 切记,如果使用了这个依赖就不能使用 2.1.6 Log4j to SLF4J Adapter

    2.1.6 JUL Adapter

    如果之前项目使用的是Java Util Logging门面日志,那么可以加入这个依赖

    <dependencies>
      <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-jul</artifactId>
        <version>2.12.1</version>
      </dependency>
    </dependencies>
    
    • The Apache Log4j implementation of java.util.logging
    • 正如下图所示,添加如上依赖后可以将 java util logging API 适配成Log4j 2.x API ,然后交给log4j 2.x 实现类实现。
    • Log4j Runtime Dependencies
      在这里插入图片描述

    2.1.7 Log4j API to SLF4J API Adapter

    如果代码中实用的是Log4j-2.x-API 日志门面,想实用SLF4作为日志门面,那么需要添加如下依赖

      <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-to-slf4j</artifactId>
        <version>2.12.1</version>
      </dependency>
    
    • 本质上是Log4j 2.x API日志门面转SLF4j API 日志门面
    • log4j-slf4j-impl 不能和log4j-to-slf4j同时使用,推荐使用log4j-slf4j-impl,否则会丢失一些log4j 2.x API的一些新特性。

    2.2 普通web项目依赖配置汇总

    		<!--日志系统 -->
    		<!--使用Log4j2 start-->
    		<!-- log4j 2.x API 日志门面 -->
    		<dependency>
    			<groupId>org.apache.logging.log4j</groupId>
    			<artifactId>log4j-api</artifactId>
    			<version>2.9.1</version>
    		</dependency>
    		<!-- log4j 2.x Core 日志实现 -->
    		<dependency>
    			<groupId>org.apache.logging.log4j</groupId>
    			<artifactId>log4j-core</artifactId>
    			<version>2.9.1</version>
    		</dependency>
    		<!-- Web模块支持-->
    		<dependency>
    			<groupId>org.apache.logging.log4j</groupId>
    			<artifactId>log4j-web</artifactId>
    			<version>2.9.1</version>
    		</dependency>
    		<!--升级兼容包-->
    		<!--该依赖会先Log4j 1.x api 转换成log4j 2.x api ,最后使用log4j2.x 实现类 -->
    		<dependency>
    			<groupId>org.apache.logging.log4j</groupId>
    			<artifactId>log4j-1.2-api</artifactId>
    			<version>2.9.1</version>
    		</dependency>
    		<!--该依赖会将Common Logging API 转换成 Log4jx2.x api,最后使用log4j2.x 实现类 -->
    		<dependency>
    			<groupId>org.apache.logging.log4j</groupId>
    			<artifactId>log4j-jcl</artifactId>
    			<version>2.9.1</version>
    		</dependency>
    		<!--将SLF4j 的实现类替换为Log4J 2实现类-->
    		<dependency>
    			<groupId>org.apache.logging.log4j</groupId>
    			<artifactId>log4j-slf4j-impl</artifactId>
    			<version>2.9.1</version>
    		</dependency>
    		<!-- 将java.util.logging API 通过该依赖转换成log4j2.x api,最后使用log4j2.x 实现类 -->
    		<dependency>
    			<groupId>org.apache.logging.log4j</groupId>
    			<artifactId>log4j-jul</artifactId>
    			<version>2.9.1</version>
    		</dependency>
    		<!-- SLF4J API -->
    		<dependency>
    			<groupId>org.slf4j</groupId>
    			<artifactId>slf4j-api</artifactId>
    			<version>1.6.6</version>
    		</dependency>
    		<!--使用Log4j2 end-->
    

    2.3 Spring Boot 项目

    对于Spring Boot 新项目, 我们只需要如下添加如下依赖即可:

    <!--排除默认的logback日志-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-log4j2 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>
    

    2.4 关于web.xml配置

    如果是传统的web 项目,需要添加在pom.xml中添加如下依赖

     <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-web</artifactId>
        <version>2.12.1</version>
      </dependency>
    

    因为org.apache.logging.log4j.web.Log4jServletContextListener需要

    web.xml修改如下:

      <!-- 日志配置文件路径-->
      <context-param>
        <param-name>log4jConfiguration</param-name>
        <param-value>classpath:/log4j2.xml</param-value>
      </context-param>
    
    <!--日志配置监听器 -->
      <!-- log4j2 start -->
      <listener>
        <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
      </listener>
      <filter>
        <filter-name>log4jServletFilter</filter-name>
        <filter-class>org.apache.logging.log4j.web.Log4jServletFilter</filter-class>
      </filter>
      <filter-mapping>
        <filter-name>log4jServletFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>INCLUDE</dispatcher>
        <dispatcher>ERROR</dispatcher>
      </filter-mapping>
      <!-- log4j2-end -->
    

    注意

    • log4jConfiguration这个单词Log4j 2.x 以后改变了
    • 而且log4j2.xml 最好放在src/main/resources 根目录,否则可能会报找不到错误。

    2.5 关于 MDC

    我们知道在Log4j 1.x 中,MDC是一种多线程下日志管理实践方式,

    关于用法主要用于获取多线程下的一些变量

    • 比如我们可以在代码中定义一个类Log4jServletContextListener 实现ServletContextListener接口
    • 然后获取多线程下的变量,比如上下文,IP地址等。

    Log4j 1.x 实用MDC:

    class Log4jServletContextListener implements ServletContextListener{
    	  @Override
    	 public void contextInitialized(ServletContextEvent arg0) {
    		// TODO Auto-generated method stub
    		super.contextInitialized(arg0);
    		InetAddress ia=null;
            try {
            	//获取本地主机信息
                ia=InetAddress.getLocalHost();
                //获取请求的主机名称
                String localname=ia.getHostName();
                //获取请求的IP地址
                String localip=ia.getHostAddress();
                //获取应用程序的上下文
                String path = arg0.getServletContext().getContextPath();
    
                //格式化输出到日志
    			MDC.put("ip", localip);
    			MDC.put("path", path.substring(1));
            } catch (Exception e) {
                // TODO Auto-generated catch block
               log.error(e.getMessage(),e);
            }
    	}
    }
    

    Log4j 2.x 则需要使用ThreadContext

    Log4j2 升级后要实用ThreadContext 替换MDC

    class Log4j2ServletContextListener implements ServletContextListener{
    	  @Override
    	 public void contextInitialized(ServletContextEvent arg0) {
    		// TODO Auto-generated method stub
    		super.contextInitialized(arg0);
    		InetAddress ia=null;
            try {
            	//获取本地主机信息
                ia=InetAddress.getLocalHost();
                //获取请求的主机名称
                String localname=ia.getHostName();
                //获取请求的IP地址
                String localip=ia.getHostAddress();
                //获取应用程序的上下文
                String path = arg0.getServletContext().getContextPath();
    
                //格式化输出到日志
    			ThreadContext.put("ip", localip);
    			ThreadContext.put("path", path.substring(1));
            } catch (Exception e) {
                // TODO Auto-generated catch block
               log.error(e.getMessage(),e);
            }
    	}
    }
    

    最后修改日志布局中就可以 用 %X{path} 和%X{ip} 来配置打印该内容

    <PatternLayout charset="GB18030" pattern="%d{yyyy/MM/dd HH:mm:ss,SSS} %X{path} %X{ip} %-5level %l %n%msg%n"/>
    

    2.6 Log4j 2.x 与Jboss 兼容性

    当前 Jboss 版本 JBoss 6.4 (Jboss EAP 6.x)

    15:08:32,192 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-4) JBAS015876: 开始 "******-1.0.war" 的部署(runtime-name: "******-1.0.war"15:08:35,536 WARN  [org.jboss.as.server.deployment] (MSC service thread 1-3) JBAS015852: 无法对 META-INF/versions/9/module-info.class 里的类 /D:/apps/jboss-eap-6.4/bin/content/*******-1.0.war/WEB-INF/lib/log4j-api-2.11.0.jar 进行索引: java.lang.IllegalStateException: Unknown tag! pos=4 poolCount = 32
    	at org.jboss.jandex.Indexer.processConstantPool(Indexer.java:665) [jandex-1.2.2.Final-redhat-1.jar:1.2.2.Final-redhat-1]
    	at org.jboss.jandex.Indexer.index(Indexer.java:699) [jandex-1.2.2.Final-redhat-1.jar:1.2.2.Final-redhat-1]
    	at org.jboss.as.server.deployment.annotation.ResourceRootIndexer.indexResourceRoot(ResourceRootIndexer.java:100) [jboss-as-server-7.5.0.Final-redhat-21.jar:7.5.0.Final-redhat-21]
    	at org.jboss.as.server.deployment.annotation.AnnotationIndexProcessor.deploy(AnnotationIndexProcessor.java:51) [jboss-as-server-7.5.0.Final-redhat-21.jar:7.5.0.Final-redhat-21]
    	at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:159) [jboss-as-server-7.5.0.Final-redhat-21.jar:7.5.0.Final-redhat-21]
    	at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1980) [jboss-msc-1.1.5.Final-redhat-1.jar:1.1.5.Final-redhat-1]
    	at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1913) [jboss-msc-1.1.5.Final-redhat-1.jar:1.1.5.Final-redhat-1]
    	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [rt.jar:1.8.0_144]
    	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [rt.jar:1.8.0_144]
    	at java.lang.Thread.run(Thread.java:748) [rt.jar:1.8.0_144]
    

    2.6.1 问题分析

    出现这个原因是log4j 2.x 版本太高不兼容 Jboss EAP 6.x.

    2.6.2 解决方案

    • Log4j 2对JbossEAP 6.4 的兼容最高版本为2.9.1
    • Spring 5.x + 只支持 JBoss EAP 7.x+ 版本
    • Spring 4.3.29 是支持Jboss EAP 6.x 的最高版本

    2.7 Jboss 6.x 不兼容Log4j 2.x 冲突问题

    2.7.1 问题描述

    经过测试JBoss6.x 不兼容 Log4j 2.x ,默认使用的是Log4j 1.x 的内容,可能会出现xml配置的日志输出不来的问题。

    原因:Jboss 会自动在部署的应用上包裹一些日志模块

    D:\apps\jboss-eap-6.4\modules\system\layers\base\org\apache\log4j\
    D:\apps\jboss-eap-6.4\modules\system\layers\base\org\slf4j
    

    2.7.2 解决方案

    在WEB-INF根目录下,创建一个文件jboss-deployment-structure.xml
    配置内容如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <!--JBoss 6.x 默认采用容器自己的log4j module,该模块是应用log4j 1.x,导致自己配置的log4j 2.x不起作用,因此需要应用做一些设置-->
    <jboss-deployment-structure>
        <deployment>
            <!--排除掉Jboss自带的日志模块-->
            <exclusions>
                <module name="org.apache.log4j" />
                <module name="org.jboss.log4j.logmanager" />
                <module name="org.slf4j" />
                <module name="org.slf4j.impl" />
                <module name="org.slf4j.jcl-over-slf4j" />
                <module name="org.slf4j.ext" />
                <module name="ch.qos.cal10n" />
                <module name="org.jboss.logmanager" />
            </exclusions>
        </deployment>
    </jboss-deployment-structure>
    

    log4j2.xml 最好 放到 src/main/resources根目录下
    jboss-deployment-structure.xml 放到src/main/webapp/WEB-INF/ 根目录下

    0x03 log4j 2.x XML配置和自定义线程日志

    0x04 参考博文

    本篇完~


    喜欢我的博文,欢迎点赞和关注~

    展开全文
  • log4j.properites

    2017-10-16 18:56:32
    log4j的配置文档。可以直接放到项目中使用。不用再到网上找配置代码
  • 文章目录1. 下载layui文档 == 我从别人哪里fork过来的2. layui文档上传到服务器3. nginx配置到layui文档的目录4. 访问 - 大功告成   背景:官方layui文档关停,用人家的镜像文档...将layui放到linux随便一个文件夹

    背景:官方layui文档关停,用人家的镜像文档过一阵子又用不了实属恶心人,所以想着自己部署到自己服务器上,想看就看

    1. 下载layui文档 == 我从别人哪里fork过来的

    https://gitee.com/changenen/layui_doc
    

    2. layui文档上传到服务器

    将layui放到linux上随便一个文件夹(Nginx配置也随之改变,如想直接粘贴复制我的配置,也根据我的路径上传即可)
    

    在这里插入图片描述

    3. nginx配置到layui文档的目录

    Nginx配置 == 请自行取有关layui的配置即可 == 配置好Nginx重新加载Nginx配置即可生效

    user www www;
    worker_processes auto;
    error_log /www/wwwlogs/nginx_error.log crit;
    pid /www/server/nginx/logs/nginx.pid;
    worker_rlimit_nofile 51200;
    
    events {
        use epoll;
        worker_connections 51200;
        multi_accept on;
    }
    
    http {
        include mime.types;
        #include luawaf.conf;
    
        include proxy.conf;
    
        default_type application/octet-stream;
    
        server_names_hash_bucket_size 512;
        client_header_buffer_size 32k;
        large_client_header_buffers 4 32k;
        client_max_body_size 50m;
    
        sendfile on;
        tcp_nopush on;
    
        keepalive_timeout 60;
    
        tcp_nodelay on;
    
        fastcgi_connect_timeout 300;
        fastcgi_send_timeout 300;
        fastcgi_read_timeout 300;
        fastcgi_buffer_size 64k;
        fastcgi_buffers 4 64k;
        fastcgi_busy_buffers_size 128k;
        fastcgi_temp_file_write_size 256k;
        fastcgi_intercept_errors on;
    
        gzip on;
        gzip_min_length 1k;
        gzip_buffers 4 16k;
        gzip_http_version 1.1;
        gzip_comp_level 2;
        gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml;
        gzip_vary on;
        gzip_proxied expired no-cache no-store private auth;
        gzip_disable "MSIE [1-6]\.";
    
        limit_conn_zone $binary_remote_addr zone=perip:10m;
        limit_conn_zone $server_name zone=perserver:10m;
    
        server_tokens off;
        
        
        access_log /www/wwwlogs/access.log;
        log_format main '$scheme-$remote_addr - $remote_user [$time_local] "$request" '
        '$status $body_bytes_sent "$http_referer" '
        '"$http_user_agent" "$http_x_forwarded_for"'
        '"$request_time" "$upstream_response_time"';
        
        
        upstream baota {
            server 127.0.0.1:9000;
        }
    
        server {
            listen 888;
            server_name phpmyadmin;
            index index.html index.htm index.php;
            root /www/server/phpmyadmin;
            location ~ /tmp/ {
                return 403;
            }
    
            #error_page   404   /404.html;
            include enable-php.conf;
    
            location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
                expires 30d;
            }
    
            location ~ .*\.(js|css)?$ {
                expires 12h;
            }
    
            location ~ /\. {
                deny all;
            }
        }
    
    
        server {
            listen 80;
            error_page 400 404 413 /4xx.html;
            error_page 500 502 503 504 /50x.html;
            
            # layui文档
            location /layui_doc {
              root /www/project;
            }
    
            
            # layer文档
            location /layer  {
               root /www/project/layui_doc;
            }
            
            # laydate文档
            location /laydate  {
               root /www/project/layui_doc;
            }
            
            location / {
                # layui文档引用的静态文件配置
                if ($http_referer ~ '(layui_doc/)|(doc/)|(layer/)|(layui/)|(demo/)|(laydate/)|(extend/)|(alone.html)') {
                    root /www/project/layui_doc;
                    break;
                }
            }
              
        }
    
    
        include /www/server/panel/vhost/nginx/*.conf;
    }
    
    
    

    4. 访问 - 大功告成

    ip地址/layui_doc
    ip地址/layer
    ip地址/laydate
    


    在这里插入图片描述


    在这里插入图片描述


    在这里插入图片描述

    展开全文
  • ln和log怎么转化

    千次阅读 2021-05-22 09:12:55
    ln和log怎么转化2021-03-07 13:35:07文/董玉莹首先,我们要打开Excel表格,在函数栏里面输入对数公式ln,在打开excel文档,在单元格里输入“=ln(num)”,也可以是自己引用的excel中的单元格,再点击ente键r即可。...

    ln和log怎么转化2021-03-07 13:35:07文/董玉莹

    首先,我们要打开Excel表格,在函数栏里面输入对数公式ln,在打开excel文档,在单元格里输入“=ln(num)”,也可以是自己引用的excel中的单元格,再点击ente键r即可。其次,可以在excel表格找到自带的公式中有ln和log函数的,我们可以通过点击“开始”键和“自动求和"下拉对话框和“其他函数”开始转换。

    3784069430ce9cd06bb1411d7a3d5de6.png

    ln和log转化

    ln和log其实是对数的两种形式,都很简单,转化也很方便,它是一个具有周期性的对数函数,在电脑上转换极为轻松。

    首先,我们要打开Excel表格,在函数栏里面输入对数公式ln,在打开excel文档,在单元格里输入“=ln(num)”,也可以是自己引用的excel中的单元格,再点击ente键r即可。

    然后,当num是单元格时,输入正确的对数公式ln。,打开excel表格,在单元格中输入“=log(num)”字符。

    其次,可以在excel表格找到自带的公式中有ln和log函数的,我们可以通过点击“开始”键和“自动求和"下拉对话框和“其他函数”开始转换。

    之后会在出现的对话框中,我们可以选择类别为数学和三角函数,在找到LN和LOG函数就可以转化了。

    最后,在选中计算结果的单元格里,把鼠标放到该单元格右下角,当鼠标变成黑色十字的时候,按住左键往下拉,就完成了ln和log的转换。

    展开全文
  • 数据不规则,无格式 正则表达式 grok 推荐 数据规则,例如:log使用json格式 使用json抽取 推荐 有很多自己选 官网推荐使用grok抽取 以在 grok 里预定义好命名正则表达式,Grok 支持预定义的 grok 表达式 写入...
  • Log4j2远程执行代码漏洞如何攻击? 又如何修复
  • log4j2的核弹漏洞是如何被发现的?

    千次阅读 2021-12-20 00:03:37
    开篇一篇文章log4j2的codeql规则我看了codeql官方的规则,然后发现了一个2020年的规则,从而推出很可能是codeql挖的(现在哪个大佬还一个个代码看idea挖洞啊,那都...
  • Unity - 自定义Log

    千次阅读 2022-03-24 16:16:02
    百度链接:百度下载连接,失效了联系小黑 提取码:ighw 然后放到工程中。 一、日志部分 接着在你们的工程启动脚本中进行初始化(记得引入命名空间XHTools)。在初始化的时候你会发现有不同的设置。分别代表: 参数...
  • idf逆文档频率为什么要用log??

    千次阅读 2016-06-29 23:06:25
    首先,log很容易让人联想熵和简化计算,而此处无疑是前者。 这里不妨扩展下楼主的问题:TF*IDF的科学依据是什么?或者如何科学解释tf*idf,为什么tf*idf可以成为信息检索领域文档关键词行之有效的权重量化方法? ...
  • 首先先了解下log4j相关的内容:输出级别的种类[javascript] view plain copyOFF 为最高等级 关闭了日志信息 FATAL 为可能导致应用中止的严重事件错误 ERROR 为严重错误 主要是程序的错误 WARN 为一般警告...
  • 但是tomcat默认的框架不是log4j的,打印出来的日志也不会保存到项目指定的地方,而对于那些系统运行过程中出现的异常信息,我们是需要监控的,所以我们会希望tomcat和项目的日志放到一个地方,这时我们就需要修改...
  • log4j2远程代码执行漏洞学习总结

    千次阅读 2022-01-01 19:19:47
    近期log4j2的漏洞闹得沸沸扬扬,在工作之余也是找了一些资料看一下相关的内容,现在网上的总结已经很全了,B站有各种漏洞复现,各大博客类网站关于JNDI相关漏洞又重新被翻了出来,我这里主要是做一些我自己的...
  • log4j输出日志前端页面

    千次阅读 2021-03-12 23:24:26
    一、简介有些时候webapp有需求将日志输出前台页面,便于开发者查看...三、参考文档四、过程1、log4j配置log4j.rootLogger=debug,stdout,WA# 选用WriterAppender作为Appender,表示以流的形式输出,这个Appender...
  • LOG日志详解

    千次阅读 多人点赞 2019-06-19 20:23:47
    欢迎关注作者博客 简书传送门 文章目录Log的用途记录Log的基本原则日志的级别划分日志对性能的影响什么时候输出日志系统启动参数、环境变量异常捕获处函数获得期望之外的结果时关键操作日志...参考文档 Log的用途...
  • spring引入log4j2日志框架

    千次阅读 2020-08-04 08:46:48
    log4j2是什么? log4j2可以用干什么?解决什么问题? log4j、slf4j、log4j2、logback之间的关系 相关配置说明 配置文件优先级 代码下载:https://gitee.com/hong99/spring/issues/I1N1DF 代码实现 项目代码...
  • 在golang中,seelog应该是比较有名的日志处理包了,功能非常强大,seelog官方文档 一、seelog主要功能 下面我们看看seelog有啥强大 设置不同级别的日志; 输出终端或文件; 过滤指定级别日志; 定义多种不同的...
  • MyBatis3 用log4j在控制台输出 SQL

    万次阅读 多人点赞 2017-04-01 12:57:05
    此方法比较简单,只需要配置 MyBatis 的配置文件 Configuration 中有相关属性即可,不用再一个 log4j.properties 文件。 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" ...
  • boost log库学习一(设计概述)

    万次阅读 2017-06-22 20:00:12
    对日志的思考为什么需要日志?如今的应用程序都非常大,代码变得难以测试及调试。而且更多的时候,这些程序运行在远离开发人员的远处,...程序运行时将所有必要的程序运行信息存储在日志,当程序出错时可以分析这些
  • git工程化 自动生成changeLog 发布版本

    千次阅读 2020-06-21 15:30:36
    git log 生成 changeLog 在进行git仓库的自动化管理时,发布前往往需要CI服务器自动生成 CHANGELOG.MD ,本文介绍如何自动changeLog.md自动生成的思路。 生成流程 多次 commit -m “xxx” 使用命令 git log > ...
  • Linux操作系统常用log日志

    千次阅读 2018-01-02 19:51:25
    Linux操作系统常用log日志 ...
  • log4cpp 详解及使用操作

    千次阅读 2019-02-12 14:27:25
    Log4cpp是一个开源的C++类库,它提供了在C++程序中使用日志和跟踪调试的功能。使用log4cpp,可以很便利地将日志或者... Log4cpp是个基于LGPL的开源项目,移植自Java的日志处理跟踪项目log4j,并保持了API的一致。...
  • 本方法主要用于配置修改,完全清理spring boot已经去除了spring-boot-starter-log4j2并切换使用logback,打包依然发现存在log4j相关包存在的解决办法。 现阶段不建议修改log4j2版本号,首先官方目前2个修复版本均...
  • log4j 日志框架使用

    万次阅读 多人点赞 2018-05-24 11:31:50
    Log4j是Apache下的一款开源的日志框架,能够满足我们在项目中对于日志记录的需求。一般来讲,在项目中,我们会结合slf4j和log4j一起使用。...首先,我们希望日志要能持久化磁盘,最基本的就是要能够保...
  • 接口文档与接口文档管理工具

    千次阅读 2021-07-12 11:16:45
    应用程序的开发,需要由前后端工程师共同定义接口,编写接口文档,之后大家都根据这个接口文档进行开发,项目结束前都要一直维护。 2.接口文档的功能与目的: (1)项目开发过程中前后端工程师有一个统一的文件...
  • 基本我们进入一家公司,开发你从事什么岗位,公司产品或项目的框架都已经搭建好,我们有时候进行改版,根据业务延伸框架,记录日志基本都是我们自己去调用封装的方法。今天我们就对Log4net进行一下学
  • Log4cpp介绍及使用

    千次阅读 2018-03-07 20:58:01
    Log4cpp是一个开源的C++类库,它提供了在C++程序中使用日志和跟踪调试的功能。使用log4cpp,可以很便利地将日志或者... Log4cpp是个基于LGPL的开源项目,移植自Java的日志处理跟踪项目log4j,并保持了API的一致...
  • Log4j2与Slf4j的最佳实践

    万次阅读 2018-05-07 21:38:30
    日志对于项目的重要性不言而喻,现在市面的日志框架多种多样:Log4j、Log4j2、Slf4j、JDKLog、Logback等等,如果没有真正深入了解过,可能会被搞得眼花缭乱。本文将介绍目前Java项目中最常见的Log4j2 + Slf4j的...
  • 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的...
  • 本文以MVC框架为例,实现log记录 在默认情况下,asp.net core有自带的可实现将日志输出控制台,注意,此时需要,运行时,要运行自托管模式才能调出控制台。如何选择自托管模式;如下 如何使用logger public ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 169,808
精华内容 67,923
关键字:

怎么把log放到文档上