Как записать файл журнала в С#?
Как написать файл журнала в С#?
В настоящее время у меня есть таймер с этим утверждением, которое тикает каждые 20 секунд:
File.WriteAllText(filePath+"log.txt", log);
Для всего, что я хочу записать, я делаю это:
log += "stringToBeLogged";
Как вы можете предположить, журнал строк просто растет и растет по мере запуска программы. (Я даже не знаю, есть ли максимум строк в строке?)
Я предполагаю, что должны быть лучшие способы сделать это. я просто подумал, что будет тяжело писать весь файл снова и снова, каждый раз, когда что-то добавляется в журнал.
Ответы
Ответ 1
С точки зрения производительности ваше решение не оптимально. Каждый раз, когда вы добавляете еще одну запись в журнал с + =, вся строка копируется в другое место в памяти. Вместо этого я рекомендую использовать StringBuilder:
StringBuilder sb;
...
sb.Append("log something");
...
// flush every 20 seconds as you do it
File.AppendAllText(filePath+"log.txt", sb.ToString());
sb.Clear();
Кстати, ваше событие таймера, вероятно, выполняется в другом потоке. Таким образом, вы можете использовать мьютекс при доступе к вашему объекту sb
.
Еще одна вещь, которую следует учитывать, - это то, что происходит с записями журнала, которые были добавлены за последние 20 секунд после выполнения. Вероятно, вы захотите очистить строку до файла до того, как приложение выйдет.
Ответ 2
создать класс для создания объекта по всему миру и вызвать его
using System.IO;
using System.Reflection;
public class LogWriter
{
private string m_exePath = string.Empty;
public LogWriter(string logMessage)
{
LogWrite(logMessage);
}
public void LogWrite(string logMessage)
{
m_exePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
try
{
using (StreamWriter w = File.AppendText(m_exePath + "\\" + "log.txt"))
{
Log(logMessage, w);
}
}
catch (Exception ex)
{
}
}
public void Log(string logMessage, TextWriter txtWriter)
{
try
{
txtWriter.Write("\r\nLog Entry : ");
txtWriter.WriteLine("{0} {1}", DateTime.Now.ToLongTimeString(),
DateTime.Now.ToLongDateString());
txtWriter.WriteLine(" :");
txtWriter.WriteLine(" :{0}", logMessage);
txtWriter.WriteLine("-------------------------------");
}
catch (Exception ex)
{
}
}
}
Ответ 3
Используйте File.AppendAllText:
File.AppendAllText(filePath + "log.txt", log);
Ответ 4
public static void WriteLog(string strLog)
{
StreamWriter log;
FileStream fileStream = null;
DirectoryInfo logDirInfo = null;
FileInfo logFileInfo;
string logFilePath = "C:\\Logs\\";
logFilePath = logFilePath + "Log-" + System.DateTime.Today.ToString("MM-dd-yyyy") + "." + "txt";
logFileInfo = new FileInfo(logFilePath);
logDirInfo = new DirectoryInfo(logFileInfo.DirectoryName);
if (!logDirInfo.Exists) logDirInfo.Create();
if (!logFileInfo.Exists)
{
fileStream = logFileInfo.Create();
}
else
{
fileStream = new FileStream(logFilePath, FileMode.Append);
}
log = new StreamWriter(fileStream);
log.WriteLine(strLog);
log.Close();
}
Ссылка:
blogspot.in
Ответ 5
Очень удобный инструмент для ведения журнала - http://logging.apache.org/log4net/
Вы также можете сделать что-то из себя менее мощным. Вы можете использовать http://msdn.microsoft.com/ru-ru/library/system.io.filestream(v = vs .110). Aspx
Ответ 6
Добавить журнал в файл со статическим классом
public static class LogWriter
{
private static string m_exePath = string.Empty;
public static void LogWrite(string logMessage)
{
m_exePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
if (!File.Exists(m_exePath + "\\" + "log.txt"))
File.Create(m_exePath + "\\" + "log.txt");
try
{
using (StreamWriter w = File.AppendText(m_exePath + "\\" + "log.txt"))
AppendLog(logMessage, w);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
private static void AppendLog(string logMessage, TextWriter txtWriter)
{
try
{
txtWriter.Write("\r\nLog Entry : ");
txtWriter.WriteLine("{0} {1}", DateTime.Now.ToLongTimeString(),DateTime.Now.ToLongDateString());
txtWriter.WriteLine(" :");
txtWriter.WriteLine(" :{0}", logMessage);
txtWriter.WriteLine("-------------------------------");
}
catch (Exception ex)
{
}
}
}
Ответ 7
Есть 2 простых способа
Ответ 8
if(!File.Exists(filename)) //No File? Create
{
fs = File.Create(filename);
fs.Close();
}
if(File.ReadAllBytes().Length >= 100*1024*1024) // (100mB) File to big? Create new
{
string filenamebase = "myLogFile"; //Insert the base form of the log file, the same as the 1st filename without .log at the end
if(filename.contains("-")) //Check if older log contained -x
{
int lognumber = Int32.Parse(filename.substring(filename.lastIndexOf("-")+1, filename.Length-4); //Get old number, Can cause exception if the last digits aren't numbers
lognumber++; //Increment lognumber by 1
filename = filenamebase + "-" + lognumber + ".log"; //Override filename
}
else
{
filename = filenamebase + "-1.log"; //Override filename
}
fs = File.Create(filename);
fs.Close();
}
Ссылка:
http://www.codeproject.com/Questions/163337/How-to-write-in-log-Files-in-C
Ответ 9
Это добавляет новую строку в файл
using (var file = new StreamWriter(filePath + "log.txt", true))
{
file.WriteLine(log);
file.Close();
}