如何解决将 StreamWriter 用于日志文件的正确方法
仅供参考-原始海报不能使用开源或第三方库。
我正在创建一个将使用日志文件的应用程序。 我想知道创建日志文件的“正确”方式是什么(在系统管理、良好实践、资源管理等方面)
第一种方法:
public partial class Form1 : Form
{
string path = "SomeFile.txt";
StreamWriter writer;
public Form1()
{
writer = new StreamWriter(path);
InitializeComponent();
}
public void LogWriteLine(string print)
{
writer.WriteLine(print);
}
protected override void Dispose(bool disposing)
{
if (writer != null) writer.Close();
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
}
第二种方法:
public partial class Form1 : Form
{
string path = "SomeFile.txt";
public Form1()
{
InitializeComponent();
}
public void LogWriteLine(string print)
{
using (StreamWriter writer = new StreamWriter(path))
{
writer.WriteLine(print);
}
}
}
我知道第二种方法可以在线查看日志文件,而第一种方法只有在应用程序关闭后才能查看日志文件,这与我的使用无关。
如果可能的话,我想得到一个“通用”的答案(对于会经常使用 LogWriteLine 的应用程序和很少使用它的应用程序,如果这对本次讨论很重要的话)。
谢谢。
解决方法
由于您不能使用外部代码,我建议简单就是好的。 StreamWriter
有多种挑战:
1] 如果多个线程想同时登录怎么办?
2] 性能怎么样,你不应该一直保持 StreamWriter
打开吗? (见#1)。
3] 如果您想归档或删除日志怎么办?
避免 StreamWriter
主要为您解决这些问题。微软已经提供了一个方便的 append api。
public class Logger
{
private readonly string file;
public Logger(string file)
{
System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(file));
this.file = file;
}
public void Log(string text)
{
string line = DateTime.UtcNow.ToString("o") + " " + text + Environment.NewLine;
// kick off log in background,don't slow main app down
System.Threading.Tasks.Task.Run(async () =>
{
// try 10 times to log in the unlikely event two calls get at the file at the same time
for (int i = 0; i < 10; i++)
{
try
{
// this avoids locking the log file in case it needs to be cleaned up,and adds a timestamp to each row.
await System.IO.File.AppendAllTextAsync(file,line);
break;
}
catch (System.IO.IOException)
{
// wait a bit,unlikely to hit this but just in case...
await Task.Delay(20);
}
}
}).GetAwaiter();
}
}
用法:
Logger logger = new Logger("c:/logs/log.txt"); // change to your path
logger.Log($"An event happend with data {data.Value}");
,
当谈到性能和优化时,第二种方法是在评论中提到的#steve
如果从那个表单打开,第一种方法会有问题 另一种形式并希望写入同一个日志文件(因为它应该 除非您希望程序的每个类都有不同的日志)
但是如果你愿意,你应该使用第一种方式
- 不允许用户在应用运行时访问日志
- 如果目标设备中的内存 (RAM) 不是问题,因为此方法需要更多内存
如果你想,你应该使用第二种方法
- 为应用中的所有模块创建通用日志
- 简单的日志记录
- 减轻 RAM 负担
- 允许任何人在应用运行时访问日志
然而,您应该在专业或发布版本中使用云日志记录以获得更好的性能和分析,例如 Firebase 或自定义日志记录桥
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。