精华内容
下载资源
问答
  • log4j打印日志到控制台
    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-如何将日志打印到控制台? : https://blog.csdn.net/u011479200/article/details/102459717
  • 平时为了方便测试和定位错误(特别是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);
        }
    }
    
    展开全文
  • 运行驱动程序时,输出可以在控制台上很好地打印,但是我还需要控制台上的确切输出才能打印到文件中。但是,我似乎无法获得控制台输出以打印到文件。 我在这里尝试过这个建议如何将控制台输出写入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:21
    Java输出日志到控制台主要是靠PrintStream来完成,如: System.out 的源码就是个PrintStream 因此,想要截取控制台需要自己来接替PrintStream的部分工作。 二、替换输出流 首先,我们需要一个...

    一、控制台输出:PrintStream类

    Java输出日志到控制台主要是靠PrintStream来完成,如:

    System.out
    

    的源码就是个PrintStream
    System.out
    因此,想要截取控制台需要自己来接替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 控制台 打印表格 可前往http://blog.csdn.net/j506825719/article/details/78996659查看效果图后再决定是否需要下载。
  • 将对象通过console打印成表格样式(类似控制台mysql查询) 支持list,List<Object> ,Object[],Iterator,Object等,不支持如:List<Integer> 等泛型为基本数据类型的集合。
  • 一、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.xml中只需增加 <logger name="com.zyc.dao" level="DEBUG"></logger>即可
  • ## 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....
  • 1、e.printStackTrace()打印在哪里在catch中的e.printStackTrace()将打印到控制台2、e.printStackTrace()打印的内容是什么import org.apache.logging.log4j.Logger;public class ExceptionTest {private static ...
  • 项目中简单的记录日志,输出到控制台,上线直接设置输出级别,记录关键信息 实现了一个简单的日志,使用效果如上图,记录时间,日志类型,调用位置,消息内容。直接上代码,细节看注释 import java.io....
  • 主要介绍了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 ,可以往文件中写...如何规范的打印日志 日志文件命名 类型标识 指此
  • 大家都知道使用htmlunit的时候会有很多debug的日志输出,很影响实际的生产判断,网上一些关于LoggerFactory的配置、还有一些基于配置文件的配置均不能实际解决问题; 以下解决方案适用场景为:java的main方法中调...
  • 本地cmd命令, 输入命令, 并在控制台输出命令执行结果 jsch 远程sshlinux服务器, 执行结果并显示输出
  • java采集控制台日志

    2022-02-12 15:43:52
    java采集控制台日志
  • 主要介绍了java控制台输出百分比进度条示例,需要的朋友可以参考下
  • Java获取时间打印到控制台代码实例

    千次阅读 2021-02-12 23:41:26
    这篇文章主要介绍了Java获取时间打印到控制台代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下面试时有一道面试题:要求获取当时时间,并像电子手表那样...
  • 为方便排查问题,自测或测试环境的日志打印SQL。 2. 方式 1. 方式一:IDEA 启动参数配置 操作路径:EditConfigurations -> Configuration -> Override parameters -> + mybatis.configuration.log-impl: ...
  • 44%等级: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日志通常是如下的样子, 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:01
    importjava.io.BufferedInputStream;importjava.io.BufferedOutputStream;importjava.io.File;importjava.io.FileDescriptor;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava...
  • application.properties 加上配置 spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true
  • // 将结果循环打印输出 while ((strCmd = bufferedReader.readLine()) != null) { System.out.println(strCmd); } //子线程结束后要杀掉 process.destroy(); } 值得一提的是,最开始走的弯路是下面这样,习惯了执行...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 56,318
精华内容 22,527
关键字:

java 打印日志到控制台

java 订阅