Java-Material, das regelmäßig vorkommt. Es wurde beschlossen, bestimmte Informationen als Protokoll auszugeben, aber als Ergebnis der Überlegung, ob sie in die Datenbank oder in eine Datei ausgegeben werden sollen, habe ich beschlossen, das Protokoll in eine Datei auszugeben, also ein Memo, wenn ich es im Voraus betrachte. Die Voraussetzung ist Linux.
Die Standpunkte sind völlig unterschiedlich, aber zählen Sie auf, wie Sie sich vorstellen können
--Wenn die exklusive Verarbeitung nicht ordnungsgemäß ausgeführt wird, ist die Datei möglicherweise beschädigt.
Also habe ich ein Programm erstellt, das ein einzeiliges Protokoll aus Zeit und Text in einer Datei ausgibt. Die Datei wird monatlich generiert. Es scheint einfach zu sein, die synchronisierte Methode als exklusive Steuerung zu verwenden, daher habe ich diese Methode gewählt. Natürlich ist es eine wichtige Voraussetzung, dass Sie die Protokolldatei nur mit dieser Methode betreiben.
LogWriter.java
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Calendar;
import java.io.*;
public class LogWriterNew{
public static SimpleDateFormat sdf = new SimpleDateFormat("YYYY/MM/dd HH:mm:ss");
public static synchronized void writeLog(String text){
Calendar calendar = Calendar.getInstance();
String OUTPUT_DIR= "out";
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH) + 1;
Date date = calendar.getTime();
String yearStr = String.format("%04d", year);
String monthStr = String.format("%02d", month);
//Protokollausgabe
String file_name = OUTPUT_DIR + File.separator + yearStr + "_" + monthStr + ".log";
File file = new File(file_name);
FileWriter fw = null;
String line = sdf.format(date) + "," + text;
try{
fw = new FileWriter(file, true);
fw.write(line + "\n");
}catch(IOException e){
e.printStackTrace();
}finally {
if(fw != null) {
try {
fw.close();
}catch(Exception e2) {
e2.printStackTrace();
}
}
}
}
public static void main(String[] argv){
for(int i=0; i<1000;i++){
System.out.println(i);
writeLog(i + "aaa");
}
}
}
So was.
2020/05/23 08:25:02,0aaa
2020/05/23 08:25:02,1aaa
2020/05/23 08:25:02,2aaa
2020/05/23 08:25:02,3aaa
2020/05/23 08:25:02,4aaa
2020/05/23 08:25:02,5aaa
2020/05/23 08:25:02,6aaa
2020/05/23 08:25:02,7aaa
2020/05/23 08:25:02,8aaa
2020/05/23 08:25:02,9aaa
2020/05/23 08:25:02,10aaa
・ ・ ・ ・
Auf einem kleinen PC wurde ein Durchsatz von 850 Fällen / Sekunde erzielt.
Da FileWriter den Zeichencode nicht angeben kann, habe ich versucht, die Angabe des Zeichencodes mit OutputStreamWriter zu ermöglichen.
//Protokollausgabemethode
public static synchronized boolean writeLog(String fileName, String date, String[] items){
for(int i=0; i<items.length; i++){
items[i] = escape(items[i]);
}
String line = date + "," + String.join(",", items);
File file = new File(fileName);
PrintWriter pw = null;
try {
pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file, true), "Windows-31j")));
pw.println(line);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (pw != null) {
try {
pw.close();
} catch (Exception e2) {
e2.printStackTrace();
return false;
}
}
}
Das nächste Mal werde ich überprüfen, ob die exklusive Kontrolle wirklich durch diese Synchronisierung erfolgt.
Recommended Posts