java 打印出了对象_Java打印对象信息(二)
上一篇我们观察了System.out.println()方式打印简单类对象信息的一些注意事项,本篇我们仍以Person类为例看一下Log4j下对这种对象的处理。
《二》采用Log4j打印对象信息:
首先引入Log4j的jar包,本篇采用的是
log4j
log4j
1.2.16
然后配置Log4j,把log4j.properties放到maven项目的resources目录下:
### 设置###
log4j.rootLogger = debug,stdout,D,E
### 输出信息到控制抬 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File =E:/test0serv/test01serv/logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =E:/test0serv/test01serv/logs/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
测试用例代码:
import org.apache.log4j.Logger;
public class Person {
private static Logger logger = Logger.getLogger(Person.class);
private int age;
private String name;
public Person() {
}
public Person(int age, String name) {
this.age = age;
this.name = name;
}
public static void main(String[] args) {
Person p = new Person(22, "Allen");
System.out.println("System.out.println:");
System.out.println(p);
System.out.println("org.apache.log4j.Logger:");
logger.info(p);
}
}
程序运行输出结果为:
System.out.println:
Person@17d0685f
org.apache.log4j.Logger:
[INFO ] 2018-08-05 18:51:47,458 method:Person.main(Person.java:22)
Person@17d0685f
生成的log中的信息如下图:
可以看出在Person类没有重写 toString()函数的情况下,Log4j的输出对象信息和System.out.println是一致的,都不能明确打印出对象的成员信息。下面我们重写Object类中的toString()函数:
import org.apache.log4j.Logger;
public class Person {
private static Logger logger = Logger.getLogger(Person.class);
private int age;
private String name;
public Person() {
}
public Person(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "年龄:" + age + ";名字:" + name;
}
public static void main(String[] args) {
Person p = new Person(22, "Allen");
System.out.println("System.out.println:");
System.out.println(p);
System.out.println("org.apache.log4j.Logger:");
logger.info(p);
}
}
程序运行结果为:
System.out.println:
年龄:22;名字:Allen
org.apache.log4j.Logger:
[INFO ] 2018-08-05 19:03:33,970 method:Person.main(Person.java:27)
年龄:22;名字:Allen
log文档中也打印出了对象的信息:
下面我们删除重写的toString()函数,改成使用Lombok插件试一试效果:
import lombok.Data;
import org.apache.log4j.Logger;
@Data
public class Person {
private static Logger logger = Logger.getLogger(Person.class);
private int age;
private String name;
public Person() {
}
public Person(int age, String name) {
this.age = age;
this.name = name;
}
public static void main(String[] args) {
Person p = new Person(22, "Allen");
System.out.println("System.out.println:");
System.out.println(p);
System.out.println("org.apache.log4j.Logger:");
logger.info(p);
}
}
程序输出结果:
System.out.println:
Person(age=22, name=Allen)
org.apache.log4j.Logger:
[INFO ] 2018-08-05 19:07:38,808 method:Person.main(Person.java:23)
Person(age=22, name=Allen)
log文档中也有对应的信息:
经过测试,我们想说的是,在定义一个类时,如果没有使用Lombok类似功能的插件,最好按照JDK文档的建议,实现Object类中的toString()函数,这样在打印日志对象的时候,不会出现打印出“Person@17d0685f” 这样不清不楚的信息,而且非常不利于排查问题,当你排查问题正需要看到某个对象的信息,却发现这样的日志输出,恐怕会长叹一声吧,所以最好还是按照规范来,避免这种情况。
java 打印出了对象_Java打印对象信息(二)相关推荐
- Algs4-1.1.13编写一段代码,打印出一个M行N列的二维数组的转置(交换行和列)
1.1.13编写一段代码,打印出一个M行N列的二维数组的转置(交换行和列). public class Test { public static void main(String[] arg ...
- java常见对象_Java各种对象理解
关于VO.PO的理解-java的(PO,VO,TO,BO,DAO,POJO)解释收藏 O/R Mapping 是 Object Relational Mapping(对象关系映射)的缩写.通俗点讲,就 ...
- java类怎么删除对象_java中对象的生成使用和删除
请教大神,在java里,对象生成后,如何删除对象呢?请教大神,在java里,对象生成后,如何删除对象呢? 对象状态由JVM自动管理,GC线程自动回收无用对象,无需也不能自己删除对象. 请问在JAVA中 ...
- java input是关键字吗_Java中对象的串行化(Serialization)和transient关键字 - 金色阳光...
Java中对象的串行化(Serialization)和transient关键字: 对象的串行化(Serialization) 一.串行化的概念和目的 1.什么是串行化 对象的寿命通常随着生成该对象的程 ...
- java class对象_java class对象
RTTI 运行时类型信息 与 Reflect 反射 RTTI,Run Time Type Information,运行时类型信息. 要理解RTTI在java中的工作原理,必须知道 类型信息 在 运行时 ...
- php用打印出实心菱形,php打印实心菱形
编程打印实心菱形的四种算法 刘雨玚 [期刊名称]<福建电脑> [年(卷),期]2016(032)004 [摘要]本文提出了编程打印实心菱形的四种算法,其中前三种方法都是将实 心菱形分为上下 ...
- inputstream转fileinputstream对象_Java Web--Servlet--HttpServletResponse对象
HttpServletResponse对象 一.HttpServletResponse对象介绍 1.1.负责向客户端(浏览器)发送数据的相关方法 1.2.负责向客户端(浏览器)发送响应头的相关方法 1 ...
- 怎么用计算机打印出东西,如何用纸打印出细胞“计算机”?
细胞墨水冲压工艺 近日,西班牙庞培法布拉大学(PFU)生物医学应用合成生物学研究团队的Sira Mogas-Díez.Eva Gonzalez-Flo和Javier Macía等人,通过纸上细胞打印, ...
- 用java怎么写三角形图案_Java 打印三角形图案
以下是打印三角形图案的Java程序- 示例import java.util.*; public class Demo{ public static void main(String[] args){ ...
- java 泛型 与类反射_Java技能 —— 对象泛型以及类反射机制的应用
一,泛型和反射的初识 Java泛型是JDK 5中引入的一个新特性,泛型提供了编译时类型安全监测机制,该机制允许程序员在编译时监测非法的类型.简单的理解就是参数化类型,我们一开始就知道这个泛型T是Str ...
最新文章
- Zeal 离线API文档浏览器
- WIN7 64位系统下,右下角的声音和电源图标不见的解决办法
- Python 3.8 新特性全面解读
- 关于.net实现网站模板机制(非标签替换)
- ssh汉字乱码怎么办_ssh中文乱码解决
- adb server version (41) doesn‘t match this client (39); killing
- Script 入门实践
- 浅谈分布式一致性协议之2PC
- 数据库优化常用的途径(方法)
- node重命名文件名_node文件批量重命名
- 分享146个培训课件PPT模板,总有一款适合你
- 数据库系统概念第六版课后习题答案-第二章
- 离线数仓项目, 数仓理论(概要, 建模方法, 数仓分层, 模型介绍,元数据), 数仓设计(需求分析, 数据埋点, 指标体系, 架构设计(方案选型,逻辑架构, 物理环境, 命名规范))
- 美团设计模式在外卖营销业务中的实践-学习笔记(一)
- EXCEL:获取某列或得中最后一个非空单元格的行数和数值
- 英雄联盟更新完服务器维护,英雄联盟lol今天维护到什么时候结束 停服更新期间玩家是无法进入游戏...
- Python:打印星号
- 自然语言处理seq2seq模型实现人工智能对对联(基于TensorFlow框架)
- 计算机音乐我还是曾经那个少年,我还是曾经的那个少年什么歌曲
- oracle18c shard技术分享-安装部署
热门文章
- 第三次作业代码规范修改
- MongoDB进阶系列(12)——MongoDB 固定集合
- OpenSource.com 评出 2014 年十佳开源软件
- spring(12)
- 重磅推出Android4开发系列精品课程
- 《BREW进阶与精通——3G移动增值业务的运营、定制与开发》连载之32---BREW PUSH 服务...
- 建立网站需要什么条件_教育学校网站建设有什么作用?学校建立网站为的是什么?...
- 安卓接入高德地图3dmap黑屏问题解决
- PHP可变变量($$)
- linux下设置set位权限,网络安全系列之四十 在Linux中设置SET位权限