Reputation: 6969
I built an application and want to use logging in my application before giving it out to a user to know the actions the user did in case before any error.
I haven't used logging before, so I did a bit of study to find out good methods for the same and perhaps Trace
class in .NET looks like what might help in this scenario.
Using a text file seems to be a better idea here for the logging setting a TextWriterTraceListener
in the App.Config
file of my project, and using in the code Trace.Writeline("Error info", "Field");
1) Even after reading good amount of content, I am not sure about good approaches for logging?
Should there be different error logger and information logging files?
How does logging work for specifying different types of error (such as warning, critical, error etc.?)
2) I want to use the same logfile in one of my other projects in the solution. So, do I add the same Trace Listener
section in the App.Config
of my project?
Upvotes: 3
Views: 5153
Reputation: 38427
With a logging library (such as log4net), you can do all the things you are asking about easily. You can set up your logging in a config file to go to event log, file, console, etc (or any combination) and set the logging levels independently.
That is, you can say the file will have informationals, warnings, errors, and fatals, but the event log will log only the errors and fatals.
In general, nearly all of the logging libraries have these features. The examples below are just in terms of log4net but the same concepts apply to most logging libraries...
To get the logger in any class in your solution, you just need to ask for a logger in your class:
public MyClass
{
private static readonly ILog _log = log4net.LogManager.GetLogger(typeof(MyClass));
public void SomeMethod()
{
_log.Debug("This is a debug message.");
_log.Info("This is an informational message.");
_log.Warn("This is a warning message.");
_log.Error("This is an error message.");
_log.Fatal("This is a fatal message.");
}
}
In addition, you can filter based on the loggers, that is, you could suppress log messages from paraticular classes or only display logging messages for a subset of classes, etc.
A sample config settings block would look like this. This creates a rolling file appender (keeps several days worth of logs) and Console appender
<log4net>
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="c:\logs\AgentLog"/>
<appendToFile value="true"/>
<datePattern value=".yyyy-MM-dd"/>
<rollingStyle value="Date"/>
<MaxSizeRollBackups value="14"/>
<param name="StaticLogFileName" value="false"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%d{HH:mm:ss.fff} [%thread] %-5level %logger{1} - %m%n"/>
</layout>
</appender>
<appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender">
<mapping>
<level value="FATAL"/>
<foreColor value="Yellow"/>
<backColor value="Red, HighIntensity"/>
</mapping>
<mapping>
<level value="ERROR"/>
<foreColor value="Red, HighIntensity"/>
</mapping>
<mapping>
<level value="WARN"/>
<foreColor value="Yellow, HighIntensity"/>
</mapping>
<mapping>
<level value="INFO"/>
<foreColor value="Green, HighIntensity"/>
</mapping>
<mapping>
<level value="DEBUG"/>
<foreColor value="White"/>
</mapping>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%d{HH:mm:ss.fff} [%thread] %-5level %logger{1} - %m%n"/>
</layout>
</appender>
<root>
<level value="INFO"/>
<appender-ref ref="RollingFileAppender"/>
<appender-ref ref="ColoredConsoleAppender"/>
</root>
</log4net>
Upvotes: 4