2017-06-22 74 views
3

我知道如何在Java中創建出現在控制檯日誌消息:如何將java默認記錄器直接輸出到文件中?

java.util.logging.Logger.getLogger(<CLASSNAME>.class.getName()).log(Level.INFO, "LOG MESSAGE"); 

不過,我目前工作的一個Web應用程序(在NetBeans IDE)。在Web應用程序中,不幸的是不能將記錄器輸出到控制檯。

因此,我想直接輸出到一個文件。

但是,無論我嘗試過,沒有工作。

例如,我嘗試這樣做:

How to write logs in text file when using java.util.logging.Logger

這: https://examples.javacodegeeks.com/core-java/util/logging/java-util-logging-example/

...和許多其他的東西,但沒有任何作品!

如何將輸出指向文本文件如此困難?

有沒有人知道如何做java默認記錄器直接輸出到文件?

+0

的web應用程序如Tomcat或Glassfish的一個Web服務器上運行的工作。您還需要配置他們的日誌記錄,而不是單獨的應用程序。看到這裏作爲一個例子:https://stackoverflow.com/questions/24990515/how-to-redirect-log4j-logging-from-catalina-out-to-separate-file?rq=1一些第三方日誌框架,如log4j可能會有幫助 –

+0

已經嘗試過log4j ...也沒有工作...你也可以將log4j應用到單個應用btw ...你不必爲整個tomcat配置它 –

+2

'已經嘗試過log4j ... didn我也確定你是以錯誤的方式使用它,或者錯過了一些配置。你可以參考[這個](http://www.codejava.net/coding/how-to-initialize-log4j-for-java-web-application)教程 –

回答

2

我希望能夠在我的Java Netbeans應用程序中執行與正常應用程序中相同的操作:將打印語句寫入控制檯或某些文件以進行調試。

我測試了這個與NetBeans創建一個全新的web項目運行Tomcat 8與新的servlet。我修改了servlet來包括:

Logger.getLogger("foo").info("This is a test message."); 

,結果是打印到控制檯的Tomcat默認情況下,在項目沒有變化到Tomcat,沒有變更項目,並沒有logger.properties。

在Web應用程序中,很遺憾不能將記錄器輸出到控制檯。

您應該在Netbeans底部有多個選項卡。一個是運行編譯器並啓動Tomcat的Netbeans ANT任務的控制檯輸出。然後您應該有另一個選項卡,它是Tomcat實例的輸出。在該選項卡下,您應該看到記錄器消息。該logging in Tomcat指出System.err/out被重新映射到文件:

當在Unix系統中運行Tomcat,控制檯輸出通常重定向到一個名爲catalina.out的文件。在Windows上作爲服務運行時,控制檯輸出也會被捕獲並重定向,但文件名稱不同。

默認位置位於名爲logs的文件夾下的Tomcat或域名系列中。由於安裝的控制檯處理程序和System.err被重新映射到文件,因此缺省配置應該已經將記錄器輸出寫入文件。它可能不是你想要的位置。

即使System.err/out被重新映射,您也可以通過創建自己的custom handler寫入到JVM控制檯來寫入java.io.FileDescriptor

import java.io.FileDescriptor; 
import java.io.FileOutputStream; 
import java.util.logging.LogRecord; 
import java.util.logging.SimpleFormatter; 
import java.util.logging.StreamHandler; 

public class FileDescriptorHandler extends StreamHandler { 

    public FileDescriptorHandler() { 
     super(new FileOutputStream(FileDescriptor.out), new SimpleFormatter()); 
    } 

    @Override 
    public synchronized void publish(LogRecord record) { 
     super.publish(record); 
     super.flush(); 
    } 

    @Override 
    public void close() { 
     flush(); 
    } 
} 

默認情況下,Netbeans將捕獲並顯示此控制檯輸出。如果您只是編寫打印到console的代碼,情況也是如此。

如何難以直接輸出到文本文件? 有沒有人知道如何做java默認記錄器直接輸出到文件?

這也包括在Tomcat documentation

例logging.properties爲servlet-示例web應用被放置在WEB-INF /類web應用內:

handlers = org.apache.juli.FileHandler, java.util.logging.ConsoleHandler 
.handlers = org.apache.juli.FileHandler, java.util.logging.ConsoleHandler 

############################################################ 
# Handler specific properties. 
# Describes specific configuration info for Handlers. 
############################################################ 

org.apache.juli.FileHandler.level = FINE 
org.apache.juli.FileHandler.directory = ${catalina.base}/logs 
org.apache.juli.FileHandler.prefix = ${classloader.webappName}. 

java.util.logging.ConsoleHandler.level = FINE 
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter 

請注意,對於Tomcat,您必須declare the handlers that can be used與標準LogManager不同。

如果您無法獲取日誌配置文件,請將servlet上下文偵聽器添加到您的項目並手動安裝文件處理程序。

import java.io.IOException; 
import java.util.logging.FileHandler; 
import java.util.logging.Handler; 
import java.util.logging.Logger; 
import javax.servlet.ServletContextEvent; 
import javax.servlet.annotation.WebListener; 
import javax.servlet.ServletContextListener; 

@WebListener 
public class HandlerInstaller implements ServletContextListener { 

    private static final Logger logger = Logger.getLogger(""); 
    private Handler target; 

    @Override 
    public synchronized void contextInitialized(ServletContextEvent sce) { 
     try { 
      target = new FileHandler(); 
      logger.addHandler(target); 
     } catch (IOException | RuntimeException ex) { 
      sce.getServletContext().log(sce.toString(), ex); 
     } 
    } 

    @Override 
    public synchronized void contextDestroyed(ServletContextEvent sce) { 
     logger.removeHandler(target); 
     target.close(); 
     target = null; 
    } 
} 
+0

你可能有一個點,但它正好在我的頭上...我已經閱讀過你引用的Tomcat文檔,我甚至創建了一個屬性文件......它不工作......這個FileDescriptorHandler將如何提供幫助?我需要在哪裏初始化它? 是否必須傳遞給另一個對象(例如記錄器?) –

1

你可以在你的項目目錄的類路徑

Netbeans logging : http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/doc-files/logging.html 
Java Util logging with logging properties file sample : http://www.javapractices.com/topic/TopicAction.do?Id=143 
4

試試這個提供你自己的日誌文件。它將在項目文件夾中創建一個文本文件。

請確保刷新以查看文件。

import java.io.File; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Properties; 
import java.util.logging.FileHandler; 
import java.util.logging.Handler; 
import java.util.logging.Logger; 
import java.util.logging.SimpleFormatter; 


public class Test { 
    static Handler fileHandler = null; 
    private static final Logger LOGGER = Logger.getLogger(Test.class 
      .getClass().getName()); 

    public static void setup() { 

     try { 
      fileHandler = new FileHandler("./logfile.log");//file 
      SimpleFormatter simple = new SimpleFormatter(); 
      fileHandler.setFormatter(simple); 

      LOGGER.addHandler(fileHandler);//adding Handler for file 

     } catch (IOException e) { 
      // TODO Auto-generated catch block 
     } 

    } 

public static void main(String[] args) { 
    setup();//calling to the file content 
    LOGGER.info("------------------START--------------------"); 
     //here the Information or Contents that in file 
    } 
    } 
1

您應該強烈考慮使用java.nio.file.Path;

這適用於我;把文件放在任何你想要的地方!

final Logger LOGGER = Logger.getLogger(logIntextfile.class 
      .getClass().getName()); 
public void WriteToLog() { 
     Path path = Paths.get("c:", "myFiles", "logfile.log"); 

     try { 
      FileHandler file = new FileHandler(path.toString()); 
      SimpleFormatter simple = new SimpleFormatter(); 
      file.setFormatter(simple); 
      LOGGER.addHandler(file); 

     } catch (IOException e) { 
      System.err.println ("Try another day"); 
     } 

這也於Mac OS

Path path = Paths.get("/Users/",System.getProperty("user.name"),"myFiles", "logfile.log"); 
相關問題