-
2021-11-04 15:10:15
log4j.rootLogger=WARN,console
#输出到控制台
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%-5p][%-22d{yyyy/MM/dd HH:mm:ssS}][%l]%m%n
log4j.appender.console.Threshold=WARN
log4j.appender.console.ImmediateFlush=TRUE
log4j.appender.console.Target=System.out更多相关内容 -
log4j-如何将日志打印到控制台:log4j-demo.zip
2019-10-10 15:37:10log4j-如何将日志打印到控制台? : https://blog.csdn.net/u011479200/article/details/102459717 -
Java控制台日志打印封装
2021-08-11 21:28:54平时为了方便测试和定位错误(特别是demo工具时),又不想依赖日志框架,习惯使用System.out.println(),但这种知识简单输出文本,而且打印异常时不好定位,对打印不同级别的日志也不能满足需求。本文对System.out....平时为了方便测试和定位错误(特别是demo工具时),又不想依赖日志框架,习惯使用
System.out.println()
,但这种知识简单输出文本,而且打印异常时不好定位,对打印不同级别的日志也不能满足需求。本文对System.out.println()
进行简单封装,轻量级调用。以前这样打印日志:
public static void main(String[] args) { testLogPrintBefore(); } private static void testLogPrintBefore() { System.out.println("hello world!"); try { LogTest logTest = null; logTest.clone(); } catch (Exception e) { System.out.println("发生了一个错:" + e.getMessage()); } }
输出:
hello world! 发生了一个错:null
可以看出非常不直观,只是简单输出文本,定位错误不好。
使用
ConsoleUtils
之后:public static void main(String[] args) { testLogPrintAfter(); } private static void testLogPrintAfter() { ConsoleUtils.d("hello world!"); ConsoleUtils.i("hello world!"); ConsoleUtils.w("hello world!"); try { LogTest logTest = null; logTest.clone(); } catch (Exception e) { ConsoleUtils.w("发生了一个错误", e); } ConsoleUtils.e("hello world!"); ConsoleUtils.e("hello world!", new RuntimeException("发生了一个错误")); try { Class.forName("java.util.Test"); } catch (ClassNotFoundException ignored) { ConsoleUtils.e("hello world!", ignored); } }
输出:
2021-08-12 17:20:587/D:testLogPrintAfter(LogTest.java:24)hello world! ---->Thread:main 2021-08-12 17:20:605/I:testLogPrintAfter(LogTest.java:25)hello world! ---->Thread:main 2021-08-12 17:20:605/W:testLogPrintAfter(LogTest.java:26)hello world! ---->Thread:main 2021-08-12 17:20:606/W:testLogPrintAfter(LogTest.java:32)发生了一个错误 ---->Thread:main java.lang.NullPointerException at com.sjl.socket.demo.LogTest.testLogPrintAfter(LogTest.java:30) at com.sjl.socket.demo.LogTest.main(LogTest.java:18) 2021-08-12 17:20:606/E:testLogPrintAfter(LogTest.java:35)hello world! ---->Thread:main 2021-08-12 17:20:606/E:testLogPrintAfter(LogTest.java:36)hello world! ---->Thread:main java.lang.RuntimeException: 发生了一个错误 at com.sjl.socket.demo.LogTest.testLogPrintAfter(LogTest.java:36) at com.sjl.socket.demo.LogTest.main(LogTest.java:18) 2021-08-12 17:20:607/E:testLogPrintAfter(LogTest.java:40)hello world! ---->Thread:main java.lang.ClassNotFoundException: java.util.Test at java.net.URLClassLoader.findClass(URLClassLoader.java:382) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:264) at com.sjl.socket.demo.LogTest.testLogPrintAfter(LogTest.java:38) at com.sjl.socket.demo.LogTest.main(LogTest.java:18)
上面虽然信息多了,日志定位信息时非常明了,输出了日志时间、日志级别、调用方法,定位行、描述信息,非常适合平时做一些测试之类工作的日志打印
ConsoleUtils
是基于System.out.println
封装,不同级别日志没有特别明显的颜色区分。这里介绍一个辅助插件,Grep Console是一款和IDEA Console相关的插件(当然也适用Android)。可以通过expression表达式过滤日志、给不同级别的日志或者给不同pattern的日志加上背景色与前景色。Grep Console可以IDEA Setting->Plugin界面,搜索Grep安装即可
上面使用Grep Console插件后,输出效果如下:
可见,有颜色之后,区分非常明了
Grep Console配置截图:
最后国际规则,贴上
ConsoleUtils
的完整代码:/** * 控制台日志工具类 * * @author Kelly * @version 1.0.0 * @filename ConsoleUtils * @time 2021/8/11 11:24 * @copyright(C) 2021 song */ public class ConsoleUtils { private static final int LOG_DEBUG = 1; private static final int LOG_INFO = 2; private static final int LOG_WARN = 3; private static final int LOG_ERROR = 4; private static final int PLATFORM_ANDROID = 0; private static final int PLATFORM_PC = 1; /** * 是否显示日志 */ private static boolean debug = true; public static void d(Object msg) { printLog(LOG_DEBUG, msg, null); } public static void i(Object msg) { printLog(LOG_INFO, msg, null); } public static void w(Object msg) { printLog(LOG_WARN, msg, null); } public static void w(Object msg, Throwable tr) { printLog(LOG_WARN, msg, tr); } public static void e(Object msg) { printLog(LOG_ERROR, msg, null); } public static void e(Object msg, Throwable tr) { printLog(LOG_ERROR, msg, tr); } /** * 打印日志 * * @param type * @param msgObj * @param tr * @return */ private static int printLog(int type, Object msgObj, Throwable tr) { if (!debug) { return -1; } String level = "--"; switch (type) { case LOG_DEBUG: level = "D"; break; case LOG_INFO: level = "I"; break; case LOG_WARN: level = "W"; break; case LOG_ERROR: level = "E"; break; } int platformFlag = checkPlatform(); String content = createLog(msgObj.toString(), platformFlag) + (tr != null ? ('\n' + getStackTraceString(tr)) : ""); StringBuilder sb = new StringBuilder(); String formatDate = getFormatTime(); if (platformFlag == PLATFORM_ANDROID) { sb.append(content); } else { sb.append(formatDate).append("/").append(level).append(":").append(content); } System.out.println(sb.toString()); return 0; } /** * 创建日志定位信息 * * @param msg * @param platformFlag * @return */ private static String createLog(String msg, int platformFlag) { StringBuilder builder = new StringBuilder(); try { Thread thread = Thread.currentThread(); int stackTraceIndex; if (platformFlag == PLATFORM_ANDROID) { //这里根据把ConsoleUtils所在的位置确认,可以打个断点确认 stackTraceIndex = 5; } else { stackTraceIndex = 4; } StackTraceElement[] stackTrace = thread.getStackTrace(); String className = stackTrace[stackTraceIndex].getFileName(); String methodName = stackTrace[stackTraceIndex].getMethodName(); int lineNumber = stackTrace[stackTraceIndex].getLineNumber(); builder.append(methodName); builder.append("(").append(className).append(":").append(lineNumber).append(")"); builder.append(msg); builder.append(" ---->").append("Thread:").append(thread.getName()); } catch (Exception e) { e.printStackTrace(); } return builder.toString(); } private static int checkPlatform() { try { Class.forName("android.os.Build"); return PLATFORM_ANDROID; } catch (ClassNotFoundException ignored) { return PLATFORM_PC; } } /** * 获取日志异常栈信息 * * @param tr * @return */ public static String getStackTraceString(Throwable tr) { if (tr == null) { return ""; } Throwable t = tr; while (t != null) { if (t instanceof UnknownHostException) { return ""; } t = t.getCause(); } StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw, false); tr.printStackTrace(pw); pw.flush(); pw.close(); return sw.toString(); } private static String getFormatTime() { Date date = new Date(); String strDateFormat = "yyyy-MM-dd mm:ss:SSS"; SimpleDateFormat sdf = new SimpleDateFormat(strDateFormat); return sdf.format(date); } }
-
Java:打印到控制台和文件
2021-03-15 10:21:06运行驱动程序时,输出可以在控制台上很好地打印,但是我还需要控制台上的确切输出才能打印到文件中。但是,我似乎无法获得控制台输出以打印到文件。 我在这里尝试过这个建议如何将控制台输出写入txt文件通过做这个...我有点问题
我正在运行一个包含许多类的程序,并使用一个驱动程序来运行所有这些类。 运行驱动程序时,输出可以在控制台上很好地打印,但是我还需要控制台上的确切输出才能打印到文件中。
但是,我似乎无法获得控制台输出以打印到文件。 我在这里尝试过这个建议
如何将控制台输出写入txt文件
通过做这个
import java.io.FileOutputStream;
import java.io.PrintStream;
public class Compiler {
public static void main(String args[]){
try {
Parse parser = new Parse();
SemanticAnalyzer sAnalyzer = new SemanticAnalyzer();
String parserfile= parser.parsefile(args[0]);
sAnalyzer.semanticAnalysis(parserfile);
PrintStream out = new PrintStream(new FileOutputStream("output.txt"));
System.setOut(out);
} catch (Exception e) {
e.printStackTrace();
}
}
}
但是文件仍然空白(可能是因为打印语句在其他文件中?)。
有人有什么想法吗?
您应该在任何控制台输出之前调用setOut
我敢肯定,在我完成键入操作之前,它将得到答复。但是,这里发生的是您将(默认)输出流从控制台重定向到文件。如果要打印到两个位置,则需要有一个实际上记录到两个位置的PrintStream。 (或者您可以查找一个日志记录解决方案-有几个)。但是,为了对此有所了解,可以:
http://docs.oracle.com/javase/7/docs/api/java/io/PrintStream.html
您可以实现一个PrintStream或OutputStream(可能是更好的选择),方法是实现接口并分别记录到文件和控制台中(喜欢!)。
@Voicu上面已经解释了一种更简单的方法,但是感觉有些误导,那就是有一种方法可以通过创建一个新方法来替换System.out();调用,该方法将这些流指定为输出的一部分。您可以轻松创建一个静态方法来解决此问题:
//Redirect via a method
public static PrintStream FILE = new PrintStream(new FileOutputStream("output.txt"));
public static void log(String x)
{
FILE.println(x);
System.out.println(x);
}
现在,一个可怕的但实用的解决方案看起来像这样:
public static class DualStream extends PrintStream
{
private PrintStream out;
private PrintStream file;
public DualStream(File file, PrintStream out) throws FileNotFoundException
{
super(file);//I'm being SUPER lazy/hacky here
this.out = out;
this.file = new PrintStream(file);
}
//... through all the methods I want to use...
public void println(String x) {
out.println(x);
file.println(x);
}
}
public static void main(String ... args) throws FileNotFoundException
{
DualStream out = new DualStream(new File("output.txt"), System.out);
System.setOut(out);
System.out.println("This is a test");
}
现在,这是糟糕的代码,首先,我违反了构造函数的约定,以使其正常工作,但它确实起作用。我根本不建议这样做,我只是想证明它确实可以做到。正确的方法是使用那里的许多记录器之一,或者坦率地说,将命令行上的输出重定向到所需的位置。
在这种情况下,您想要使用的操作系统或正在运行的服务器:
(如何将命令的输出重定向到两个文件)
这确实可以实现您想要的功能,但是允许用户根据需要进行登录。如果您不想使用日志记录系统(Log4J,日志记录包等)进行日志记录,那么我将把它留给您的用户使用,而只需使用err / out而不是过多考虑。 java -jar myjar.jar > log.txt
创建一种方法,在将输出到两个流的所有内容输出时将在整个代码中使用:
private void output(String text, PrintStream ps1, PrintStream ps2) {
ps1.println(text);
ps2.println(text);
}
并从代码中调用它:
PrintStream ps = new PrintStream(new FileOutputStream("output.txt"));
output("text1", System.out, ps);
output("text2", System.out, ps);
output("text3", System.out, ps);
ps.close();
谢谢!,但是现在它不能打印到控制台了:
@ Razor88您的方法适用于打印到控制台或文件。 为了同时打印到两者,您可以进行日志记录(例如log4j),用于同时打印到两者的外部库(Apache Commons IO)或构建如上所述的方法以打印到两个(或更多)流。
-
Java获取控制台输出日志的方法
2019-05-14 11:18:21Java输出日志到控制台主要是靠PrintStream来完成,如: System.out 的源码就是个PrintStream 因此,想要截取控制台需要自己来接替PrintStream的部分工作。 二、替换输出流 首先,我们需要一个...一、控制台输出:PrintStream类
Java输出日志到控制台主要是靠PrintStream来完成,如:
System.out
的源码就是个PrintStream
因此,想要截取控制台需要自己来接替PrintStream的部分工作。二、替换输出流
首先,我们需要一个ByteArrayOutputStream类来代替PrintStream的工作,为了实现截取打印日志的功能这里我继承ByteArrayOutputStream类写了一个自定义的工具类ConsoleStream:
public class ConsoleStream extends ByteArrayOutputStream { private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; private PrintStream oldPrintStream; private PrintStream newPrintStream; public ConsoleStream(PrintStream oldPrintStream){ this.oldPrintStream=oldPrintStream; this.newPrintStream = new PrintStream(this); } private static int hugeCapacity(int minCapacity) { if (minCapacity < 0) { throw new OutOfMemoryError(); } return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; } private void ensureCapacity(int minCapacity) { // overflow-conscious code if (minCapacity - buf.length > 0){ grow(minCapacity); } } private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = buf.length; int newCapacity = oldCapacity << 1; if (newCapacity - minCapacity < 0){ newCapacity = minCapacity; } if (newCapacity - MAX_ARRAY_SIZE > 0){ newCapacity = hugeCapacity(minCapacity); } buf = Arrays.copyOf(buf, newCapacity); } /** * Writes the specified byte to this byte array output stream. * * @param b the byte to be written. */ @Override public synchronized void write(int b) { ensureCapacity(count + 1); buf[count] = (byte) b; count += 1; } /** * Writes <code>len</code> bytes from the specified byte array * starting at offset <code>off</code> to this byte array output stream. * * @param b the data. * @param off the start offset in the data. * @param len the number of bytes to write. */ @Override public synchronized void write(byte b[], int off, int len) { String s = new String(b); //切换回原输出流输出日志到真控制台 System.setOut(oldPrintStream); System.out.print("newStream:"+s); System.setOut(newPrintStream); if ((off < 0) || (off > b.length) || (len < 0) || ((off + len) - b.length > 0)) { throw new IndexOutOfBoundsException(); } ensureCapacity(count + len); System.arraycopy(b, off, buf, count, len); count += len; } }
其中我们重写了 write(byte b[], int off, int len) 和它的构造方法,传参byte b[] 为写入的日志,你可以用它做你想做的事。其中:
//切换回原输出流输出日志到真控制台 System.setOut(oldPrintStream); System.out.print("newStream:"+s); System.setOut(newPrintStream);
这部分代码是为了解决由于我们截取了PrintStream,导致真正的控制台以及依赖于控制台的日志插件无日志输出的问题。
同时我们需要将控制台输出流导向我们重写的这个工具类,在main方法中加入以下代码:
//备份原有输出流 PrintStream old = System.out; ConsoleStream newStream= new ConsoleStream(old); //设置新的输出流 System.setOut(new PrintStream(newStream));
此时控制台的日志打印已由新建的工具类接替。
-
Java 控制台 打印表格 改进版
2018-01-17 23:58:24Java 控制台 打印表格 可前往http://blog.csdn.net/j506825719/article/details/78996659查看效果图后再决定是否需要下载。 -
java console、控制台按照表格样式打印数据源码(样式-左对齐)
2020-09-25 21:26:26将对象通过console打印成表格样式(类似控制台mysql查询) 支持list,List<Object> ,Object[],Iterator,Object等,不支持如:List<Integer> 等泛型为基本数据类型的集合。 -
日志打印输出到控制台以及文件
2022-03-30 10:22:54一、application.properties文件配置 #root 日志级别以WARN级别输出 ...#配置控制台日志显示格式 logging.pattern.console=%d{yyyy/MM/dd-HH:mm:ss} [%thread] %-5level %logger- %msg%n #配置文件中日志 -
Java中打印日志的几种方式
2019-02-15 11:51:11最简单的方式,就是system.println.out(error) ,这样直接在控制台打印消息了。 Java.util.logging ; 在JDK 1.4 版本之后,提供了日志的API ,可以往文件中写日志了。 log4j , 最强大的记录日志的方式。 可以通过配置... -
logback打印日志到控制台
2020-08-11 15:48:36在 logback.xml中只需增加 <logger name="com.zyc.dao" level="DEBUG"></logger>即可 -
java log4j 打日志到控制台同时打印到不同文件
2021-02-13 01:20:41## Licensed to the Apache Software Foundation (ASF) under one or more# contributor license agreements. See the NOTICE file distributed with#this work foradditional information regarding copyright own.... -
java异常在控制台和日志里面的打印记录
2021-04-17 02:00:261、e.printStackTrace()打印在哪里在catch中的e.printStackTrace()将打印到控制台2、e.printStackTrace()打印的内容是什么import org.apache.logging.log4j.Logger;public class ExceptionTest {private static ... -
java 实现一个简单的日志功能,输出到文件或者输出到控制台
2018-08-08 10:52:18项目中简单的记录日志,输出到控制台,上线直接设置输出级别,记录关键信息 实现了一个简单的日志,使用效果如上图,记录时间,日志类型,调用位置,消息内容。直接上代码,细节看注释 import java.io.... -
java启动jar包将日志打印到文本的简单操作
2020-08-18 14:30:44主要介绍了java启动jar包将日志打印到文本的简单操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 -
【Java】输出到控制台
2022-04-25 12:10:26目录 基本语法 代码示例 格式化字符 基本语法 System.out.println(msg); // 输出一个字符串, 带换行 System.out.print(msg); // 输出一个字符串, 不带换行 ... print 的格式化输出方式和C语言的 printf 是... -
输出日志到控制台和文件(Java项目)
2017-10-11 15:59:45# 应用于控制台 log4j .appender .CONSOLE =org .apache .log 4j .ConsoleAppender log4j .appender .CONSOLE .Threshold =INFO log4j .appender .CONSOLE .Target =System .out log4j .appender .CONSOLE .... -
JAVA 打印日志
2020-12-10 16:35:20前言 最简单的方式,就是system.println.out(error) ,这样直接在控制台打印消息了。 Java.util.logging ; 在JDK 1.4 版本之后,提供了日志的API ,可以往文件中写...如何规范的打印日志 日志文件命名 类型标识 指此 -
java htmlunit 设置控制台禁止或不打印日志
2022-03-26 19:55:57大家都知道使用htmlunit的时候会有很多debug的日志输出,很影响实际的生产判断,网上一些关于LoggerFactory的配置、还有一些基于配置文件的配置均不能实际解决问题; 以下解决方案适用场景为:java的main方法中调... -
java控制台输入cmd命令, ssh远程linux shell命令, 并打印命令输出到控制台
2017-11-24 09:51:02本地cmd命令, 输入命令, 并在控制台输出命令执行结果 jsch 远程ssh到linux服务器, 执行结果并显示输出 -
java采集控制台日志
2022-02-12 15:43:52java采集控制台日志 -
java控制台输出百分比进度条示例
2020-09-04 12:04:02主要介绍了java控制台输出百分比进度条示例,需要的朋友可以参考下 -
Java获取时间打印到控制台代码实例
2021-02-12 23:41:26这篇文章主要介绍了Java获取时间打印到控制台代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下面试时有一道面试题:要求获取当时时间,并像电子手表那样... -
MyBatis 控制台打印日志
2022-03-14 21:05:01为方便排查问题,自测或测试环境的日志中打印SQL。 2. 方式 1. 方式一:IDEA 启动参数配置 操作路径:EditConfigurations -> Configuration -> Override parameters -> + mybatis.configuration.log-impl: ... -
java log打印的日志会在控制台输出吗
2021-03-08 03:08:0344%等级:13已帮助:9560人会的啊编写log4j.properties文件,配置日5261志信息4102### 把日1653志信息输出到控制台 ###log4j.appender.stdout=org.apache.log4j.ConsoleAppender//日志信息将写到控制台log4j.... -
java打印日志的几种方式
2021-01-25 11:06:33最简单的方式,就是system.println.out(error) ,这样直接在控制台打印消息了; Java.util.logging ; 在JDK 1.4 版本之后,提供了日志的API ,可以往文件中写日志了; log4j , 最强大的记录日志的方式。 可以通过配置... -
在java控制台提取sql语句
2019-01-18 15:18:52在java的控制台中看到的sql日志通常是如下的样子, Preparing: SELECT in (0,1) ORDER BY i.UPDATE_DATE_TIME DESC 2019-01-18 10:12:52,566 [DEBUG](org.apache.ibatis.logging.log4j.Log4jImpl.debug(Log4jImpl.... -
Java打印表格 Console/控制台
2020-09-14 11:18:46功能: 控制台打印表格,支持字段动态长度,左对齐,设置最多打印多少行。 更多代码请参考具体类,下载链接:[https://download.csdn.net/download/qq_26599807/12840079] -
Java中打印输出到日志文件
2021-02-12 09:30:01importjava.io.BufferedInputStream;importjava.io.BufferedOutputStream;importjava.io.File;importjava.io.FileDescriptor;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava... -
springdata 打印jpa sql日志到控制台
2020-09-21 11:14:36application.properties 加上配置 spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true -
java执行dos命令,并打印在控制台
2021-09-03 11:07:12// 将结果循环打印输出 while ((strCmd = bufferedReader.readLine()) != null) { System.out.println(strCmd); } //子线程结束后要杀掉 process.destroy(); } 值得一提的是,最开始走的弯路是下面这样,习惯了执行...