Java.util.logging.Logger का उपयोग करते समय पाठ फ़ाइल में लॉग कैसे लिखें


147

मेरे पास एक स्थिति है जिसमें मैं अपने द्वारा बनाई गई सभी लॉग को एक पाठ फ़ाइल में लिखना चाहता हूं।

हम लॉग बनाने के लिए java.util.log.ogger API का उपयोग कर रहे हैं।

मैंने कोशिश की:

private static Logger logger = Logger.getLogger(className.class.getName());
FileHandler fh;   
fh = new FileHandler("C:/className.log");   
logger.addHandler(fh); 

लेकिन फिर भी कंसोल पर अपने लॉग हो रही केवल ....



2
फ़ाइलहैंडलर का उपयोग करके कई उत्तर सुझाते हैं, जैसा कि आप मूल रूप से करने की कोशिश कर रहे थे। एक बात से अवगत होना (एक सबक दर्द से सीखा): FileHandler सिंक्रनाइज़ है । जिसका अर्थ है, एक अत्यधिक मल्टीथ्रेडेड एप्लिकेशन में, आप सभी को एक संभावित गतिरोध की आवश्यकता होती है, एक ऑब्जेक्ट को लॉग इन करने के लिए पास किया जाता है जिसका स्ट्रींग () विधि एक सिंक्रनाइज़ किए गए विधि को कॉल करता है। फ़ाइलहैंडलर से सावधान रहें।
टिम बोउद्रेउ

जवाबों:


238

इस नमूने की कोशिश करो। इससे मेरा काम बनता है।

public static void main(String[] args) {  

    Logger logger = Logger.getLogger("MyLog");  
    FileHandler fh;  

    try {  

        // This block configure the logger with handler and formatter  
        fh = new FileHandler("C:/temp/test/MyLogFile.log");  
        logger.addHandler(fh);
        SimpleFormatter formatter = new SimpleFormatter();  
        fh.setFormatter(formatter);  

        // the following statement is used to log any messages  
        logger.info("My first log");  

    } catch (SecurityException e) {  
        e.printStackTrace();  
    } catch (IOException e) {  
        e.printStackTrace();  
    }  

    logger.info("Hi How r u?");  

}

MyLogFile.log पर आउटपुट तैयार करता है

Apr 2, 2013 9:57:08 AM testing.MyLogger main  
INFO: My first log  
Apr 2, 2013 9:57:08 AM testing.MyLogger main  
INFO: Hi How r u?

संपादित करें:

कंसोल हैंडलर को निकालने के लिए, उपयोग करें

logger.setUseParentHandlers(false);

चूंकि ConsoleHandler मूल लॉगर के साथ पंजीकृत है, जिससे सभी लॉगर प्राप्त होते हैं।


1
यह मेरे लिए काम कर रहा है ... लेकिन मैं भी सांत्वना में लॉग हो रही हूँ। वहाँ से कैसे निकालें?
पंकज

क्या आप मुझे सुझाव दे सकते हैं कि यदि मैं सभी लॉग रखना चाहता हूं तो मुझे क्या करना चाहिए। वास्तव में इस दृष्टिकोण से मेरी पाठ फ़ाइल को प्रतिस्थापित किया जा रहा है यदि मैं अपना एप्लिकेशन 2 बार चलाऊं?
पंकज

1
यह कैसे करना है ... मैं इसे Google करता हूं लेकिन मुझे बहुत सारे भ्रमित कोड मिले ... क्या आप कृपया मदद कर सकते हैं ..
पंकज

7
@bluemunch आप FileHandler(path, true)लॉग लॉग को मौजूदा लॉग फ़ाइल में बनाने के लिए वैकल्पिक कंस्ट्रक्टर का उपयोग कर सकते हैं ।
श्री हर्ष चिलकापति

1
@ लाईन हाँ। इस मामले के लिए मैं आमतौर पर एक लॉग लकड़हारा उपयोगिता विधि रखता हूं।
श्री हर्ष चिलकापति

16

सबसे पहले, आपने अपने लकड़हारे को कहाँ से परिभाषित किया था और किस वर्ग से इसे कॉल करने की कोशिश कर रहा था? एक काम का उदाहरण है, ताजा बेक्ड:

public class LoggingTester {
    private final Logger logger = Logger.getLogger(LoggingTester.class
            .getName());
    private FileHandler fh = null;

    public LoggingTester() {
        //just to make our log file nicer :)
        SimpleDateFormat format = new SimpleDateFormat("M-d_HHmmss");
        try {
            fh = new FileHandler("C:/temp/test/MyLogFile_"
                + format.format(Calendar.getInstance().getTime()) + ".log");
        } catch (Exception e) {
            e.printStackTrace();
        }

        fh.setFormatter(new SimpleFormatter());
        logger.addHandler(fh);
    }

    public void doLogging() {
        logger.info("info msg");
        logger.severe("error message");
        logger.fine("fine message"); //won't show because to high level of logging
    }
}   

आपके कोड में आप फ़ॉर्मैटर को परिभाषित करना भूल गए हैं, यदि आपको सरल की आवश्यकता है तो आप इसे कर सकते हैं जैसा कि मैंने ऊपर उल्लेख किया है, लेकिन एक और विकल्प है, आप इसे अपने आप से प्रारूपित कर सकते हैं, एक उदाहरण है (बस इस पंक्ति के बजाय इसे सम्मिलित करें fh .setFormatter (नया SimpleFormatter ()) निम्नलिखित कोड):

fh.setFormatter(new Formatter() {
            @Override
            public String format(LogRecord record) {
                SimpleDateFormat logTime = new SimpleDateFormat("MM-dd-yyyy HH:mm:ss");
                Calendar cal = new GregorianCalendar();
                cal.setTimeInMillis(record.getMillis());
                return record.getLevel()
                        + logTime.format(cal.getTime())
                        + " || "
                        + record.getSourceClassName().substring(
                                record.getSourceClassName().lastIndexOf(".")+1,
                                record.getSourceClassName().length())
                        + "."
                        + record.getSourceMethodName()
                        + "() : "
                        + record.getMessage() + "\n";
            }
        });

या कोई अन्य संशोधन जो आपको पसंद हो। आशा करता हूँ की ये काम करेगा।


9

लॉग फ़ाइल का स्थान logging.properties फ़ाइल के माध्यम से नियंत्रित किया जा सकता है। और इसे JVM पैरामीटर पूर्व के रूप में पारित किया जा सकता है:java -Djava.util.logging.config.file=/scratch/user/config/logging.properties

विवरण: https://docs.oracle.com/cd/E23549_01/doc.1111/e14568/handw.m

फ़ाइल हैंडलर को कॉन्फ़िगर करना

किसी फ़ाइल में लॉग भेजने के लिए, LogH.properties फ़ाइल में हैंडलर संपत्ति में FileHandler जोड़ें। यह विश्व स्तर पर फ़ाइल लॉगिंग को सक्षम करेगा।

handlers= java.util.logging.FileHandler निम्नलिखित गुणों को सेट करके हैंडलर को कॉन्फ़िगर करें:

java.util.logging.FileHandler.pattern=<home directory>/logs/oaam.log
java.util.logging.FileHandler.limit=50000
java.util.logging.FileHandler.count=1
java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter

java.util.logging.FileHandler.pattern आउटपुट फ़ाइल के स्थान और पैटर्न को निर्दिष्ट करता है। डिफ़ॉल्ट सेटिंग आपके घर की निर्देशिका है।

java.util.log.FileHandler.limit निर्दिष्ट करता है, बाइट्स में, वह अधिकतम राशि जो लकड़हारा किसी एक फाइल पर लिखता है।

java.util.logging.FileHandler.count निर्दिष्ट करता है कि कितने आउटपुट फ़ाइलों को चक्र से गुजरना है।

java.util.log.FileHandler.formatter java.util.log फ़ॉर्मैटर क्लास को निर्दिष्ट करता है जो फ़ाइल हैंडलर वर्ग लॉग संदेशों को प्रारूपित करने के लिए उपयोग करता है। SimpleFormatter लॉग रिकॉर्ड के संक्षिप्त "मानव-पठनीय" सारांश लिखते हैं।


$ JDK_HOME / jre / lib / logging.properties के बजाय इस कॉन्फ़िगरेशन फ़ाइल का उपयोग करने के लिए जावा को निर्देश देने के लिए:

java -Djava.util.logging.config.file=/scratch/user/config/logging.properties

महान उत्तर, जो मैं देख रहा हूं, वह एकमात्र वैश्विक है। मैंने JDK में ही लॉगिंग.प्रोपर्टीज बदलने के साथ जाने का फैसला किया (हालांकि जावा 11 में, वे जावा इंस्टॉलेशन डायरेक्टरी से संबंधित निर्देशिका में स्थित हैं)। इस तरह की लॉग फ़ाइल का डिफ़ॉल्ट स्थान ध्यान देने योग्य है कि user.home / javaX.log (जहाँ user.home सिस्टम छिद्र है, और X क्रम में अगला नंबर है - पहले एक के लिए यह 0 होगा)।
लाइन

5

जावा के लिए log4j नाम की एक अच्छी लाइब्रेरी उपलब्ध है ।
यह कई सुविधा प्रदान करेगा। लिंक के माध्यम से जाओ और आप अपने समाधान मिल जाएगा।


पहले से ही log4j2 है, लेकिन इसे परियोजना स्तर पर कॉन्फ़िगर किया जाना है
Pini Cheyni

5

शायद यह वही है जो आपको चाहिए ...

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

/**
 * LogToFile class
 * This class is intended to be use with the default logging class of java
 * It save the log in an XML file  and display a friendly message to the user
 * @author Ibrabel <ibrabel@gmail.com>
 */
public class LogToFile {

    protected static final Logger logger=Logger.getLogger("MYLOG");
    /**
     * log Method 
     * enable to log all exceptions to a file and display user message on demand
     * @param ex
     * @param level
     * @param msg 
     */
    public static void log(Exception ex, String level, String msg){

        FileHandler fh = null;
        try {
            fh = new FileHandler("log.xml",true);
            logger.addHandler(fh);
            switch (level) {
                case "severe":
                    logger.log(Level.SEVERE, msg, ex);
                    if(!msg.equals(""))
                        JOptionPane.showMessageDialog(null,msg,
                            "Error", JOptionPane.ERROR_MESSAGE);
                    break;
                case "warning":
                    logger.log(Level.WARNING, msg, ex);
                    if(!msg.equals(""))
                        JOptionPane.showMessageDialog(null,msg,
                            "Warning", JOptionPane.WARNING_MESSAGE);
                    break;
                case "info":
                    logger.log(Level.INFO, msg, ex);
                    if(!msg.equals(""))
                        JOptionPane.showMessageDialog(null,msg,
                            "Info", JOptionPane.INFORMATION_MESSAGE);
                    break;
                case "config":
                    logger.log(Level.CONFIG, msg, ex);
                    break;
                case "fine":
                    logger.log(Level.FINE, msg, ex);
                    break;
                case "finer":
                    logger.log(Level.FINER, msg, ex);
                    break;
                case "finest":
                    logger.log(Level.FINEST, msg, ex);
                    break;
                default:
                    logger.log(Level.CONFIG, msg, ex);
                    break;
            }
        } catch (IOException | SecurityException ex1) {
            logger.log(Level.SEVERE, null, ex1);
        } finally{
            if(fh!=null)fh.close();
        }
    }

    public static void main(String[] args) {

        /*
            Create simple frame for the example
        */
        JFrame myFrame = new JFrame();
        myFrame.setTitle("LogToFileExample");
        myFrame.setSize(300, 100);
        myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        myFrame.setLocationRelativeTo(null);
        JPanel pan = new JPanel();
        JButton severe = new JButton("severe");
        pan.add(severe);
        JButton warning = new JButton("warning");
        pan.add(warning);
        JButton info = new JButton("info");
        pan.add(info);

        /*
            Create an exception on click to use the LogToFile class
        */
        severe.addActionListener(new ActionListener(){

            @Override
            public void actionPerformed(ActionEvent ae) {
                int j = 20, i = 0;
                try {
                    System.out.println(j/i);
                } catch (ArithmeticException ex) {
                    log(ex,"severe","You can't divide anything by zero");
                }

            }

        });

        warning.addActionListener(new ActionListener(){

            @Override
            public void actionPerformed(ActionEvent ae) {
                int j = 20, i = 0;
                try {
                    System.out.println(j/i);
                } catch (ArithmeticException ex) {
                    log(ex,"warning","You can't divide anything by zero");
                }

            }

        });

        info.addActionListener(new ActionListener(){

            @Override
            public void actionPerformed(ActionEvent ae) {
                int j = 20, i = 0;
                try {
                    System.out.println(j/i);
                } catch (ArithmeticException ex) {
                    log(ex,"info","You can't divide anything by zero");
                }

            }

        });

        /*
            Add the JPanel to the JFrame and set the JFrame visible
        */
        myFrame.setContentPane(pan);
        myFrame.setVisible(true);
    }
}

4
import java.io.IOException;
import org.apache.log4j.Appender;
import org.apache.log4j.FileAppender;
import org.apache.log4j.Logger;
import org.apache.log4j.SimpleLayout;

/**
 * @author Kiran
 * 
 */
public class MyLogger {

    public MyLogger() {
    }

    public static void main(String[] args) {
        Logger logger = Logger.getLogger("MyLog");
        Appender fh = null;
        try {
            fh = new FileAppender(new SimpleLayout(), "MyLogFile.log");
            logger.addAppender(fh);
            fh.setLayout(new SimpleLayout());
            logger.info("My first log");
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        logger.info("Hi How r u?");
    }
}

1
धन्यवाद, इससे मुझे मदद मिली, लेकिन Log4j 2 अब बाहर आ रहा है और मुझे 1.2 संस्करण को खोजने के लिए साइट के चारों ओर मछली पकड़नी थी।
सोल्यूएबल नॉनगन

3
int SIZE = "<intialize-here>"
int ROTATIONCOUNT = "<intialize-here>"

Handler handler = new FileHandler("test.log", SIZE, LOG_ROTATIONCOUNT);
logger.addHandler(handler);     // for your code.. 

// you can also set logging levels
Logger.getLogger(this.getClass().getName()).log(Level.[...]).addHandler(handler);

1

आशा है कि लोगों को यह मददगार लगे

public static void writeLog(String info) {
    String filename = "activity.log";
    String FILENAME = "C:\\testing\\" + filename;
    BufferedWriter bw = null;
    FileWriter fw = null;
    try {
        fw = new FileWriter(FILENAME, true);
        bw = new BufferedWriter(fw);
        bw.write(info);
        bw.write("\n");
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (bw != null)
                bw.close();
            if (fw != null)
                fw.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

1
हाँ, आधे घंटे का समय व्यतीत हो गया और मेरे दिमाग ने लॉग 4 जे को एक फ्रीकिन फाइल में लिखने की कोशिश की। अधिकांश उपकरण उस समस्या के लिए बहुत जटिल हैं जो वे हल कर रहे हैं।
महाई राउलिया

0

यहाँ मेरा लॉगिंग क्लास है जो स्वीकृत उत्तर पर आधारित है :

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.*;

public class ErrorLogger
{
    private Logger logger;

    public ErrorLogger()
    {
        logger = Logger.getAnonymousLogger();

        configure();
    }

    private void configure()
    {
        try
        {
            String logsDirectoryFolder = "logs";
            Files.createDirectories(Paths.get(logsDirectoryFolder));
            FileHandler fileHandler = new FileHandler(logsDirectoryFolder + File.separator + getCurrentTimeString() + ".log");
            logger.addHandler(fileHandler);
            SimpleFormatter formatter = new SimpleFormatter();
            fileHandler.setFormatter(formatter);
        } catch (IOException exception)
        {
            exception.printStackTrace();
        }

        addCloseHandlersShutdownHook();
    }

    private void addCloseHandlersShutdownHook()
    {
        Runtime.getRuntime().addShutdownHook(new Thread(() ->
        {
            // Close all handlers to get rid of empty .LCK files
            for (Handler handler : logger.getHandlers())
            {
                handler.close();
            }
        }));
    }

    private String getCurrentTimeString()
    {
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
        return dateFormat.format(new Date());
    }

    public void log(Exception exception)
    {
        logger.log(Level.SEVERE, "", exception);
    }
}

0

यहाँ कोड से लकड़हारा विन्यास को अधिलेखित करने का एक उदाहरण है। बाहरी कॉन्फ़िगरेशन फ़ाइल की आवश्यकता नहीं है ..

FileLoggerTest.java:

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.Logger;

public class FileLoggerTest {

    public static void main(String[] args) {

        try {
            String h = MyLogHandler.class.getCanonicalName();
            StringBuilder sb = new StringBuilder();
            sb.append(".level=ALL\n");
            sb.append("handlers=").append(h).append('\n');
            LogManager.getLogManager().readConfiguration(new ByteArrayInputStream(sb.toString().getBytes("UTF-8")));
        } catch (IOException | SecurityException ex) {
            // Do something about it
        }

        Logger.getGlobal().severe("Global SEVERE log entry");
        Logger.getLogger(FileLoggerTest.class.getName()).log(Level.SEVERE, "This is a SEVERE log entry");
        Logger.getLogger("SomeName").log(Level.WARNING, "This is a WARNING log entry");
        Logger.getLogger("AnotherName").log(Level.INFO, "This is an INFO log entry");
        Logger.getLogger("SameName").log(Level.CONFIG, "This is an CONFIG log entry");
        Logger.getLogger("SameName").log(Level.FINE, "This is an FINE log entry");
        Logger.getLogger("SameName").log(Level.FINEST, "This is an FINEST log entry");
        Logger.getLogger("SameName").log(Level.FINER, "This is an FINER log entry");
        Logger.getLogger("SameName").log(Level.ALL, "This is an ALL log entry");

    }
}

MyLogHandler.java

import java.io.IOException;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.SimpleFormatter;

public final class MyLogHandler extends FileHandler {

    public MyLogHandler() throws IOException, SecurityException {
        super("/tmp/path-to-log.log");
        setFormatter(new SimpleFormatter());
        setLevel(Level.ALL);
    }

    @Override
    public void publish(LogRecord record) {
        System.out.println("Some additional logic");
        super.publish(record);
    }

}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.