log4j(一)——为什么要用log4j?
一:试验环境
OS:win7
JDK:jdk7
Log4j:1.2.17(好尴尬,原本是想试验下log4j2的,结果阴差阳错用了这个版本,不过幸好,试验也不白试验,试验的作用是一样的)
二:先看两个简单的栗子然后在谈为什么吧!
(1)当我们想打印一些信息时,估计这是最容易想到的一种方式,将我们想打印的信息,打印到控制台中
/**
* Created by godtrue
*/
public class UnLog4j {
    public static void main(String[]args){
        //打印日志信息
        System.out.println("hello log4j !");
    }
}
(2)这个是使用log4j日志框架,我觉得最简单的一种实现方式,好像比(1) 麻烦不少,我们好像没有必要非使用log4j日志框架的,那么再看看下面的栗子吧!
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
/**
* Created by godtrue
*/
public class UseLog4j {
    //日志记录器
    private static Logger LOGGER = LogManager.getLogger(UseLog4j.class);
    public static void main(String[]args){
        //自动快速地使用缺省Log4j环境
        BasicConfigurator.configure();
        //打印日志信息
        LOGGER.info("hello log4j !");
    }
}
(3)这段日志信息,我们的需求稍微复杂了一点点,我们想区分开来打印的信息的级别,比如:哪些可能是错误的情况?哪些可能是警告的情况?以及顺便看一下不使用日志框架时程序运行的效率如何?
import test.log4j.bean.Person;
public class UnLog4j {
    //循环次数
    private static long CYCLE = 102;
    //程序入口——主函数
    public static void main(String[]args){
        long startTime = System.currentTimeMillis();
        for(int i=0;i<CYCLE;i++){
            if(i<100){
                try{
                    System.out.println(new Person("godtrue",100/i,'M'));//打印对象的信息
                }catch(Exception e){
                    System.out.println(i+"岁的小孩还不存在嘛!");//打印对象的信息
                }finally{
                    System.out.println("现在大部分人的年龄都在0到100岁之间的!");//打印对象的信息
                }
            }else{
                System.out.println("我是一棵树,我今年活了"+i+"岁!哈哈,我厉害吧!");//打印对象的信息
            }
        }
        System.out.println("此程序的运行时间是:"+(System.currentTimeMillis()-startTime));//打印程序运行的时间
    }
}
(4)这段日志信息和(3)的需求一模一样,使用日志框架好像更能满足一些我们的特殊需要啦,是的,这也是为什么我们选择使用日志框架的原因的
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import test.log4j.bean.Person; public class UseLog4j {
//日志记录器
private static Logger LOGGER = LogManager.getLogger(UseLog4j.class);
//循环次数
private static long CYCLE = 102;
//程序入口——主函数
public static void main(String[]args){
long startTime = System.currentTimeMillis();
//自动快速地使用缺省Log4j环境
BasicConfigurator.configure();
for(int i=0;i<CYCLE;i++){
if(i<100){
try{
LOGGER.info(new Person("godtrue",100/i,'M'));//打印对象的信息
}catch(Exception e){
LOGGER.error(i+"岁的小孩还不存在嘛!");//打印对象的信息
}finally{
LOGGER.warn("现在大部分人的年龄都在0到100岁之间的!");//打印对象的信息
}
}else{
LOGGER.info("我是一棵树,我今年活了"+i+"岁!哈哈,我厉害吧!");//打印对象的信息
}
}
LOGGER.debug("此程序的运行时间是:"+(System.currentTimeMillis()-startTime));//打印程序运行的时间
}
}
(5)这段代码平淡无奇,是用来辅助我们测试的,不过实际的开发中使用这类代码的地方可以说是到处都是
public class Person {
    //姓名
    private String name;
    //性别
    private char sex;
    //年龄
    private int age;
    //有参构造函数
    public Person(String name, int age, char sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    //无惨构造函数
    public Person() {
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", sex=" + sex +
                ", age=" + age +
                '}';
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public char isSex() {
        return sex;
    }
    public void setSex(char sex) {
        this.sex = sex;
    }
}
三:看完栗子后的感想
(1)很明显我们在编写代码的时候有各种需要打印日志的需求,比如:我们调试代码的时候;我们的应用出现了问题,我们分析、定位、解决问题的时候;我们想将某些日志信息作为离线的业务数据分析的时候等等
(2)最简单的打印日志的方式就是使用系统本身的输出语句,不过对于大多数需求这种方式都是不能满足的
(3)于是我们的目光可能会向编写一个专门打印日志信息的工具类转移,不过有人更近了一步,写出了一个日志框架供我们使用
(4)使用日志框架的好处显而易见,方便、自在、功能强大能够满足各种需求,不好的地方也是有的,比如:如果你也进行了试验你会发现,程序变慢了,需要一定的时间和精力作为学习的成本
(5)日志框架都是能控制什么哪?那我们需要打印的日志都能满足什么样的需求哪?通常我们希望一个日志框架能够灵活的做到以下三点:
5-1:能够控制日志信息想往哪里打就往哪里打,比如:控制台、文件、邮箱、数据库等等
5-2:能够控制日志信息想怎么打就怎么打,比如:我想要打印时间、程序的名称、程序的方法名、程序的行号、线程的名称等等
5-3:能够控制日志信息想打什么打什么,不想打的就不打,日志信息是分级别的,有时候我只想看错误的信息或者警告的信息,有时候我想看到所有的信息我想调试程序等等
(6)如果有这么个框架,不是太难使用我也是非常乐意玩玩的,尤其是当程序出现问题的时候,项目负责人让你赶紧解决问题,这时候有一份日志文件可供分析就好了!
四:log4j是这样的一个框架吗(很明显它是,要不然我不就白玩了嘛!)?
log4j是Apache的一个开放源代码的项目,通过使用log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
此外,通过log4j其他的语言接口,您可以在C、C++、.Net、PL/SQL程序中使用log4j,其语法和用法与在Java程序中一样,使得多语言分布式系统得到一个统一一致的日志组件模块。而且,通过使用各种第三方扩展,您可以很方便地将Log4j集成到J2EE、JINI甚至是SNMP应用中。
五:记录日志信息的作用(通俗的解释上面已经讲了,不过下面的讲法显得更专业一些)
1)监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作;
2)跟踪代码运行时轨迹,作为日后审计的依据;
3)担当集成开发环境中的调试器的作用,向文件或控制台打印代码的调试信息。
六:参考
使用Log4j进行日志操作
log4j(一)——为什么要用log4j?的更多相关文章
- log4j:WARN Please initialize the log4j system properly 问题解决
		log4j:WARN No appenders could be found for logger (com.netease.qa.testng.TestngRetry).log4j:WARN Ple ... 
- struts2 log4j:WARN Please initialize the log4j system properly. 解决方法
		在tomcat启动的时候,出现这个警告: log4j:WARN No appenders could be found for logger (org.apache.commons.digester. ... 
- log4j:WARN Please initialize the log4j system properly.解决
		log4j:WARN No appenders could be found for logger (org.springframework.context.support.ClassPathXmlA ... 
- Hibernate4搭建Log4J日志管理(附Log4j.properties配置详解)
		1.首先加入slf4j的jar包,即slf4j-api-1.6.1.jar 在hibernate官网下载hibernate-release-4.2.2.Final.zip并解压,在hibernate- ... 
- log4j:WARN Please initialize the log4j system properly解决办法
		使用log4j,报警如下: log4j:WARN No appenders could be found for logger log4j:WARN Please initialize the log ... 
- log4j 配置日志输出(log4j.properties)
		轉: https://blog.csdn.net/qq_29166327/article/details/80467593 一.入门log4j实例 1.1 下载解压log4j.jar(地址:http: ... 
- log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory). log4j:WARN Please initialize the log4j system properly. log4j:WARN See http://logging.apache.o
		上面的报错是在本地java调试(windows) hadoop集群 出现的 解决方案: 在resources文件夹下面创建一个文件log4j.properties(这个其实hadoop安装目录下的 e ... 
- Log4j(一):Log4j将日志信息写入数据库
		前言 为了监听一些数据的采集等功能,需要随时监听设备的状态,所以需要运行的时候将日志打入到数据库中. 正文 第一步: 首先是jar包,由于我使用的是springboot,所以,在springboot- ... 
- log4j:ERROR A "org.apache.log4j.DailyRollingFileAppender" object is not assignable to a "org.apache.log4j.Appender" variable.
		多个classloader加载log4j时需要设置当前Thread的classloader为你自己的classloader Thread.currentThread().setContextClass ... 
- log4j示例-Daily方式(log4j.properties)
		log_home=./log log4j.rootLogger=info log4j.category.com.ai.toptea.collection=Console,DailyFile,Daily ... 
随机推荐
- Bootstrap  & 响应式
			要了解一个东西 就是要知道 它是什么? 干什么 ? 怎么用 ? 1.Bootstrap 简介 Bootstrap 是由Twitter(著名的社交网站)推出的前端开源工具包,它基于Html.CSS. ... 
- 学习maven的各种问题
			1. The container 'Maven Dependencies' references non existing library 解决方法,将eclipse中maven插件中“resolve ... 
- Web设计思想——渐进增强
			最近在拜读一本Web体验相关的书<渐进增强--跨平台用户体验设计 >,阅读后做些总结,消化一下书中的精髓. 在阅读本文前,可以先思考下面几个问题. 1. 浏览网页的目的是什么? 2. 浏览 ... 
- ArcGIS API for JavaScript根据两个点坐标在地图上画线
			ArcGIS API for JavaScript根据两个点坐标在地图上画线比如说a(xxxx,xxxxx),b(xxxx,xxxxx).利用这两个点画一条线 var polyline = new e ... 
- ionic复选框应用
			如图:在项目中我需要实现这个效果布局和功能(进入页面默认全选,点击之后可以不选择) HTML代码: <div class="row" ng-repeat="engi ... 
- 一个编程菜鸟的进阶之路(C/C++)
			学编程是一条不归路,但我义无反顾.只能往前冲,知道这个过程是痛苦的,所以我开通这个博客,记录自己在编程中遇到的问题和心得,一是希望可以帮助跟我一样遇到同样问题的人,二是把这作为对自己的勉励及回忆: 
- R语言统计分析技术研究——卡方检验的思想和实现
			卡方检验的思想和实现 作者:李雪丽 材料摘自:百度 
- [leetcode-606-Construct String from Binary Tree]
			You need to construct a string consists of parenthesis and integers from a binary tree with the preo ... 
- 【Android Developers Training】 100. 使用Intent修改联系人数据
			注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ... 
- java的三大特性,封装,继承,多态
			封装 /** * 所谓封装,就是将对象具有的成员变量和成员函数包装和隐藏起来,让外界无法直接使用, * 被封装的成员只能通过某些特定的方式才能访问. * 实现封装有两个步骤: * 1.将不能暴露的 ... 
