log4j/slf4j

log4j的使用

  • 引入log4j.jar包
<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version>
</dependency>
  • 配置log4j.properties
log4j.rootLogger=INFO,Console,OneFile,errFile
#输出到控制台
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.encoding=utf-8 
log4j.appender.Console.Target=System.out
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH\:mm\:ss,SSS}][%c]%m%n#输出到文件级别为info
log4j.appender.OneFile=org.apache.log4j.RollingFileAppender 
log4j.appender.OneFile.encoding=utf-8 
log4j.appender.OneFile.File=../logs/test-map/info.log
log4j.appender.OneFile.MaxFileSize=10MB
log4j.appender.OneFile.MaxBackupIndex=50
log4j.appender.OneFile.Threshold=INFO  ## 只输出INFO级别以上的日志!!!
log4j.appender.OneFile.layout=org.apache.log4j.PatternLayout
log4j.appender.OneFile.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH\:mm\:ss,SSS}][%c]%m%n#输出到文件级别为error
log4j.appender.errFile=org.apache.log4j.RollingFileAppender 
log4j.appender.errFile.encoding=utf-8 
log4j.appender.errFile.File=../logs/test-map/error.log
log4j.appender.errFile.MaxFileSize=10MB
log4j.appender.errFile.MaxBackupIndex=50
log4j.appender.errFile.Threshold=ERROR   ## 只输出ERROR级别以上的日志!!!
log4j.appender.errFile.layout=org.apache.log4j.PatternLayout
log4j.appender.errFile.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH\:mm\:ss,SSS}][%c]%m%n
  • 使用方法
private static final Logger LOGGER = Logger.getLogger(Test.class);
LOGGER.info("message");

slf4j的使用

  • 引入slf4j.jar
<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.25</version>
</dependency>
  • 配置log4j.properties(通log4j)

  • 使用方法
    slf4j与log4j最大的区别在于,slf4j可以使用占位符,好处是可以防止字符串注入
    private static final Logger logger = LoggerFactory.getLogger(Test.class);

slf4j整合log4j

为什么要整合,我不知道

  • 引入maven依赖
<dependency>  <groupId>org.slf4j</groupId>  <artifactId>slf4j-log4j12</artifactId>  <version>1.7.2</version>  
</dependency>

note:如果不用maven依赖,需要导入log4j.jar、slf4j.jar、slf4j-log4j.jar三个jar包

  • 配置log4j.properties(同上)

  • 可以使用log4j,也可以使用slf4j

log4j.properties日志内容解析

  • 输入日志的级别level
    log4j.rootLogger=INFO,Console,OneFile,errFile中的info为总的输出日志的级别;后面几个参数为输出位置的标识
    日志级别有五级,越向下级别越低:
FATAL      0  
ERROR      3   为严重错误 主要是程序的错误
WARN       4   为一般警告,比如session丢失
INFO       6   为一般要显示的信息,比如登录登出
DEBUG      7  为程序的调试信息
  • 输出日志的位置appender
    log4j.appender.Console=org.apache.log4j.ConsoleAppender
    日志输出的目的地有以下几种:
 org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
  • 输出日志的格式layout
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
  • 设置日志输出级别Threshold
    log4j.appender.OneFile.Threshold=INFO ## 只输出INFO级别以上的日志!!!

  • 日志信息格式ConversionPattern
    log4j.appender.OneFile.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH\:mm\:ss,SSS}][%c]%m%n
    符号含义为:
    -X号: X信息输出时左对齐;
    %p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL,
    %d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
    %r: 输出自应用启动到输出该log信息耗费的毫秒数
    %c: 输出日志信息所属的类目,通常就是所在类的全名
    %t: 输出产生该日志事件的线程名
    %l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main (TestLog4.java:10)
    %x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
    %%: 输出一个"%"字符
    %F: 输出日志消息产生时所在的文件名称
    %L: 输出代码中的行号
    %m: 输出代码中指定的消息,产生的日志具体信息
    %n: 输出一个回车换行符,Windows平台为"/r/n",Unix平台为"/n"输出日志信息换行
    Threshold=DEBUG:指定日志消息的输出最低层次。
    ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
    Target=System.err:默认情况下是:System.out,指定输出控制台
    FileAppender 选项
    Threshold=DEBUF:指定日志消息的输出最低层次。
    ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
    File=mylog.txt:指定消息输出到mylog.txt文件。
    Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
    RollingFileAppender 选项
    Threshold=DEBUG:指定日志消息的输出最低层次。
    ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
    File=mylog.txt:指定消息输出到mylog.txt文件。
    Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
    MaxFileSize=100KB: 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到mylog.log.1文件。
    MaxBackupIndex=2:指定可以产生的滚动文件的最大数。
    log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n

spring中log4j.properties位置问题

  • 默认放在classpath路径下,即src/main/resources下

  • log4j.properties的路径改变,或者名称改变
    需要在web.xml中指定
<context-param><param-name>log4jConfigLocation</param-name><param-value>classpath*:log4j.properties</param-value></context-param>

web容器启动加载顺序问题:

引用博客家国之恋https://www.cnblogs.com/jiaguozhilian/p/5819032.html

  • 启动一个WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点: 和

  • 紧接着,容器创建一个ServletContext(上下文),这个WEB项目所有部分都将共享这个上下文.

  • 容器将转化为键值对,并交给ServletContext.

  • 容器创建中的类实例,即创建监听

  • 在监听中会有contextInitialized(ServletContextEvent args)初始化方法,在这个方法中获得ServletContext = ServletContextEvent.getServletContext();
    context-param的值 = ServletContext.getInitParameter("context-param的键");

  • 得到这个context-param的值之后,你就可以做一些操作了.注意,这个时候你的WEB项目还没有完全启动完成.这个动作会比所有的Servlet都要早.换句话说,这个时候,你对中的键值做的操作,将在你的WEB项目完全启动之前被执行.

  • 举例.你可能想在项目启动之前就打开数据库.
    那么这里就可以在中设置数据库的连接方式,在监听类中初始化数据库的连接.

  • 这个监听是自己写的一个类,除了初始化方法,它还有销毁方法.用于关闭应用前释放资源.比如说数据库连接的关闭.

    • 例1:
    <!-- 加载spring的配置文件 -->
    <context-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/applicationContext.xml,/WEB-INF/action-servlet.xml,/WEB-
    INF/jason-servlet.xml</param-value>
    </context-param>
    <listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    • 例2:自定义context-param,且自定义listener来获取这些信息
    <context-param><param-name>urlrewrite</param-name><param-value>false</param-value>
    </context-param>
    <context-param><param-name>cluster</param-name><param-value>false</param-value>
    </context-param>
    <context-param><param-name>servletmapping</param-name><param-value>*.bbscs</param-value>
    </context-param>
    <context-param><param-name>poststoragemode</param-name><param-value>1</param-value>
    </context-param>
    <listener><listener-class>com.laoer.bbscs.web.servlet.SysListener</listener-class>
    </listener>
    public class SysListener extends HttpServlet implements ServletContextListener {
    private static final Log logger = LogFactory.getLog(SysListener.class);
    public void contextDestroyed(ServletContextEvent sce) {//用于在容器关闭时,操作
    }
    //用于在容器开启时,操作
    public void contextInitialized(ServletContextEvent sce) {String rootpath = sce.getServletContext().getRealPath("/");System.out.println("-------------rootPath:"+rootpath);if (rootpath != null) {rootpath = rootpath.replaceAll("\\\\", "/");} else {rootpath = "/";}if (!rootpath.endsWith("/")) {rootpath = rootpath + "/";}Constant.ROOTPATH = rootpath;logger.info("Application Run Path:" + rootpath);String urlrewrtie = sce.getServletContext().getInitParameter("urlrewrite");boolean burlrewrtie = false;if (urlrewrtie != null) {burlrewrtie = Boolean.parseBoolean(urlrewrtie);}Constant.USE_URL_REWRITE = burlrewrtie;logger.info("Use Urlrewrite:" + burlrewrtie);其它略之....}
    }/*最终输出-------------rootPath:D:\tomcat_bbs\webapps\BBSCS_8_0_3\2009-06-09 21:51:46,526 [com.laoer.bbscs.web.servlet.SysListener]-[INFO]
    Application Run Path:D:/tomcat_bbs/webapps/BBSCS_8_0_3/2009-06-09 21:51:46,526 [com.laoer.bbscs.web.servlet.SysListener]-[INFO]
    Use Urlrewrite:true2009-06-09 21:51:46,526 [com.laoer.bbscs.web.servlet.SysListener]-[INFO]
    Use Cluster:false2009-06-09 21:51:46,526 [com.laoer.bbscs.web.servlet.SysListener]-[INFO]
    SERVLET MAPPING:*.bbscs2009-06-09 21:51:46,573 [com.laoer.bbscs.web.servlet.SysListener]-[INFO]
    Post Storage Mode:1*/

context-param和init-param区别

web.xml里面可以定义两种参数:

  • application范围内的参数,存放在servletcontext中,在web.xml中配置如下:
<context-param><param-name>context/param</param-name><param-value>avalible during application</param-value>
</context-param>
  • servlet范围内的参数,只能在servlet的init()方法中取得,在web.xml中配置如下:
<servlet><servlet-name>MainServlet</servlet-name><servlet-class>com.wes.controller.MainServlet</servlet-class><init-param><param-name>param1</param-name><param-value>avalible in servlet init()</param-value></init-param><load-on-startup>0</load-on-startup>
</servlet>

在servlet中可以通过代码分别取用:

package com.wes.controller;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
public class MainServlet extends HttpServlet ...{public MainServlet() ...{super();}public void init() throws ServletException ...{System.out.println("下面的两个参数param1是在servlet中存放的");System.out.println(this.getInitParameter("param1"));System.out.println("下面的参数是存放在servletcontext中的");System.out.println(getServletContext().getInitParameter("context/param"));}
}

第一种参数在servlet里面可以通过getServletContext().getInitParameter("context/param")得到
第二种参数只能在servlet的init()方法中通过this.getInitParameter("param1")取得.

转载于:https://www.cnblogs.com/nwu-edu/p/9416577.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/352913.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu 12.04下安装Oracle Express 11gR2

Ubuntu 12.04下安装Oracle Express 11gR2 [我的笔记] 参考1&#xff1a;http://www.linuxidc.com/Linux/2012-09/71382.htm 参考2&#xff1a;http://zhjack.blog.163.com/blog/static/14314920137153331286/ 1、点击这里下载Oracle express的安装介质 Oracle Database Express…

选择的按钮:将ToggleButtons用作单选按钮

对于MQTT.fx&#xff0c;我想使用ToggleButtons例如选择MQTT消息或QoS级别的解码&#xff1a; 我发现在ToggleGroup的上下文中&#xff0c;ToggleButton在选择/取消选择方面的行为与RadioButtons不同&#xff1a;与RadioButtons不同&#xff0c;ToggleButtons仍可以设置为未选…

php调用image类提示不存在的字体,php – 无效的字体文件名(imagettfbox)

这个问题一直被问到,但是我找不到我问题的正确答案……作为一个小背景说明,在将类文件从/ application / lib / class移到/库之前,所有代码都运行良好/ class ……我试过玩GDFONTPATH,相对的,绝对路径有和没有文件扩展名无济于事.以下是我们迄今为止尝试的一些行&#xff1a;pu…

linux文件属性之用户和组基础知识

root :x :0 :0 :root :/root :/bin/bash 账号名称 &#xff1a;账号密码 &#xff1a;账号UID &#xff1a;账号组GID &#xff1a;用户说明 &#xff…

Oracle常用命令大全(经典收藏)

一、ORACLE的启动和关闭 1、在单机环境下 要想启动或关闭ORACLE系统必须首先切换到ORACLE用户&#xff0c;如下 su - oracle a、启动ORACLE系统 oracle>svrmgrl SVRMGR>connect internal SVRMGR>startup SVRMGR>quit b、关闭ORACLE系统 oracle>svrm…

oracle共享服务器模式的图,Oracle 11g笔记——专有服务器、共享服务器模式

专有服务器模式&#xff1a;适合批处理和大任务的应用共享服务器模式&#xff1a;适合有大量并发用户的应用共享服务器模式&#xff0c;处理过程&#xff1a;1、调度进程(Dispatcher)接受多个客户端(用户进程)的连接请求&#xff0c;并把这些请求放到一个公共队列中。2、空闲的…

基于django rest framework的mock server实践

网上找了一下mock server的实现&#xff0c;发现python的基本都是基于flask来实现的&#xff0c;因最近在学django&#xff0c;就尝试用drf实现了下&#xff1a; A brief introduction of sui_mock sui mock server is an attempt that aim at dealing some issues of the thir…

在Elasticsearch中索引Java Bean的简单方法

在数据存储方面&#xff0c;Java程序员习惯于使用魔术般持久的Java Bean。 诸如Hibernate和用于关系数据存储的JPA规范或Morphia和Spring Data MongoDB之类的解决方案是受欢迎的示例。 使用Elasticsearch的开发人员有时也有相同的愿望–传递Java bean并对其进行自动索引。 提供…

sturct stat 结构体中 st_mode 的含义

在<sys/stat.h>中定义的stat结构体内容如下&#xff1a; [cpp] view plaincopyprint? struct stat { dev_t st_dev; /* ID of device containing file */ ino_t st_ino; /* inode number */ mode_t…

MATLAB求解3对角系数矩阵方程,实验5.3 用追赶法求解三对角方程组

实验5.3 用追赶法求解三对角方程组实验目的会使用Matlab 语言编程使用追赶法求解线性方程组。实验原理设系数矩阵为三对角矩阵11222331110000000000000000n n n nn b c a b c a b A a b c a b ---?? ? ? ?? ? ?? ???则方程组Axf 称为三对角方程组。设矩阵A 非奇异&…

字符串操作以及打印 —— 实现上传下载的进度条功能

import sysdef processBar(num, total):rate num / totalrate_num int(rate * 100)if rate_num 100:r \r%s>%d%%\n % ( * rate_num, rate_num,)else:r \r%s>%d%% % ( * rate_num, rate_num,)sys.stdout.write(r)sys.stdout.flushprocessBar(10,100) 转载于:https://…

php去除每行的重复文本,php删除文本文件中重复行的方法

本文实例讲述了php删除文本文件中重复行的方法。分享给大家供大家参考。具体分析如下&#xff1a;这个php函数用来删除文件中的重复行&#xff0c;还可以指定是否忽略大小写&#xff0c;和指定换行符?1234567891011121314151617181920212223242526272829303132333435363738394…

Linux环境进程间通信(五): 共享内存(上)

Linux环境进程间通信&#xff08;五&#xff09;: 共享内存&#xff08;上&#xff09; 共享内存可以说是最有用的进程间通信方式&#xff0c;也是最快的IPC形式。两个不同进程A、B共享内存的意思是&#xff0c;同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即…

JS 跳出多重循环

今天学到了如何跳出多重循环 转载于:https://www.cnblogs.com/dmc-nero/p/9573971.html

jna 使用_使用JNA的透明JFrame

jna 使用在使JFrame透明中&#xff0c;我展示了一种使用AWTUtilities类使框架透明的方法。 但是使用该类会导致访问限制编译时错误&#xff0c;该文章中还显示了Eclipse中的解析。 现在&#xff0c;这里是使用Java本机的版本。 我使用Java本机访问&#xff08;JNA&#xff09;库…

通过命令查看linux 密码,linux查看用户密码(linux查看用户密码命令)

linux查看用户密码(linux查看用户密码命令)2020-05-15 13:18:30共10个回答1、用户名和密码的存储位置存储帐号的文件:/etc/passwd存储密码的文件:/etc/shadow2、可以使用cat、more、head、tail以及vim等命令查看或者修改,如下图所示:比如要查找系统中admin普通用户的密码,则执行…

命名规范参考

转载于:https://www.cnblogs.com/jy13638593346/p/9575481.html

Guavate:桥接Guava和Java8的微型库

Java8很棒&#xff0c;并向JDK添加了一些有用的抽象&#xff0c;这些抽象通过Google出色的Guava commons库在Java社区中得到了普及。 小组讨论表明&#xff0c; 不久将有一个需要Java 8的Guava版本&#xff0c;从而弥合了Guava和Java8之间的鸿沟。 但是&#xff0c;直到这样的时…

常见的几种异常类型-熟记

今天把几个常见的异常总结一下&#xff0c;希望自己能熟记&#xff0c;别忘记&#xff01;&#xff01;&#xff01; 1.NullPointerException: 空指针异常。经验发现这个异常是经常会发生的&#xff0c;属于运行时异常。 举例&#xff1a; public static void main(String[] ar…