Is there some class that implements logging facility, that I can use? - c#

I need to use logger in my application.
I looking for some class in .net framework that i can use for this purpose - and i did not found.
Is there some ready library in .net framework that i can use for organize simple log ?

When you were looking in the framework, did you not see or not like the System.Diagnostics.Trace [1] framework?
As already mentioned log4net [2] is a good framework, we use it extensively. You may also be interested in the Log facility in the Castle Windsor IoC framework [3].
[1] http://msdn.microsoft.com/en-us/library/system.diagnostics.trace.aspx
[2] http://logging.apache.org/log4net/
[3] http://www.castleproject.org/container/facilities/trunk/logging/index.html

There are many third-party libraries for this. Check out log4net for instance.
But if all you want is to write some lines to a file it may be enough to create a text file that you write to. In that case you can use System.IO.File.CreateText(filename) to get a StreamWriter that you can log to. Then use StreamWriter.WriteLine to write to the log. Finally you should Close the StreamWriter when you are done logging.

Add a TraceListener to your app.config and use System.Diagnostics.Trace.WriteLine to write to the log.
You can have separate listeners for writing to a text file, event log etc.

elmah is good option, please check
and log4net is another
http://www.codeproject.com/KB/aspnet/Log4Net_Configuration.aspx

NLog or log4net are the most popular ones. I have mostly worked with NLog and are pretty satisfied with it. These logging frameworks allow you to define different rules and targets for logging, changing these on runtime (for debugging an app in production environment, for example) as well as using reflection so that your log messages can include things like the name of the class the log is originating from.

Related

Is there any way to define a static logger except the global Log?

i searched the document, and find nothing, all examples uses the global Log.
is serilog discourage users to define a static log in Class, and only a global Log is good enough?
but i fell that if i can get log message with the class name is more convenient.
after a heavy effort, i find something like Serilog.Log.ForContext<>(), it return a Serilog.ILogger.
i used it, but i don't know is it the correct way? no document says about it.
also, why it returns its Serilog.ILogger, and not Microsoft's ILogger?
if uses the injected Microsoft ILogger along with a static Serilog.ILogger, it seems strange. some log use log.Information, some use log.LogInformation, some use log.Info. some use Log.Warn, some use Log.Warning.
why not unify the interface to Microsoft's ILogger?
years ago, i write java. all log lib such as log4j, logback, log4j2 can use a same interface as Slf4j.
why it acts so strange in .net? NLog has its own template way, Serilog has its own template way, and Microsoft has its own template way, why?
it is only a log, why so strange and so many differenct write ways?

NLog: Limit Logger Names to Enum or other structure

I am using NLog for some logging and thanks to these answers:
Getting Logger Name into Excel file with NLog
https://stackoverflow.com/questions/50123661/nlog-in-c-sharp-with-severity-and-categories?noredirect=1#comment87344565_50123661
I am able to log different types of events (ex: "Thermal", "Database",etc.) to a single file with the logger field showing the type of event. One simply calls for example:
NLog.LogManager.GetLogger("Database").Debug("Error writing to DB");
This all works fine and might be enough. However, you'll notice that any programmer is free to put any name they want in GetLogger AND misspell it. "GetLogger("Datobuse"). It would be nice if the programmer had to choose from an enum or other structure:
NLog.LogManager.GetLogger(LoggerNames.Database).Debug("Error writing to DB");
This seems like it might be a common problem and might already have an elegant solution. I can imagine overriding the LogManager class but am not sure of the specifics. Note that LogManager is a public static class in the NLog library so not clear how to hide it. Also, there is the nice property that if you fill in the config file once in your app project, the config file works perfectly for all the projects in the solution as long as you include NLog as a reference.
I'll go down the path of creating a library project that makes use of NLog library and then include that it my main project UNLESS there is already a great solution. I'm betting there is, but haven't seen one.
Thanks,
Dave
If you have "global" logger names, then the easy solution is just to use global logger instances.
The same global NLog Logger instance can be used by multiple locations without getting into threading issues.

Error logging sample project

I need to create a Error logging project from scratch in C#.
I would like to save to a file with several levels, this logging project I am taking as an assignment from which I can learn many things and want to build it as small loggin utility for now.
I saw few loggin project which has singleton pattern and a config file having some entries and also in the consuming application config - some references of logger proj interface are there
can some one please give me an idea as how can I create a new logger
proj from scratch and what is the purpose of having entries in
config ?
pseudo code for logger project or any link
Thanks in advance.
Instead of implementing your own logging mechanism you may want to check whether existing components are an option. For example log4net is a frequently used framework that people use for .NET based projects.
Also, the Logging Application Block from Microsoft:
http://msdn.microsoft.com/en-us/library/ff632023.aspx
http://msdn.microsoft.com/en-us/library/ff664569(v=PandP.50).aspx
There are several key elements you need to consider before making one from scratch. Just to name what comes to my head :
How do you want to log? Do you want to save logs to a file, in a database, to send mails, just to have the logs shown in a console?
If you persist the logs, do you want to log everything, forever, or you want a "rolling" X lines to be kept, the rest discarded?
Do you want to have several level of logs? For example, you could log some things Info, Warning, Error, Critical Error, etc.
Do you want your logging library to support custom formatting for the logs?
As for the question about the config, it's really something you want to do. If you're talking about the app.config files, it allows you to can change the configuration of your application without rebuilding it. It can also provide some default parameters the user can override. By user, I mean another developer using your library.

Create custom logger, should I extend class from log4net

I am doing something unusual.
I have an application, it runs as a windows service.
what it does is that, it monitor one folder, when ever there is some new file put into that folder, the application will do something to the file.
Whenever there is an error when processing one file. I need to create a text file, and put the error/exception information into that text file. (later i can do something with this file)
so there is something like this
FileWatch, when there is a new file, do following :
try
{
processing file
}
catch(Exception ex)
{
MyLogger write exception message into one new text file
}
So far how i did it is that. I create a class for example MyLogger, whenever i new one MyLogger, it creates a text file (the name matters, need to be a specific format), and there is one method in side MyLogger "WriteError(string message)", it writes text into that file.
Since i used log4net in my application. Do you think i should modify my logger, to extend some class from log4net, so that i can get some benefit? (not sure what kind of benefit i will get, but log4net is a good logging framework, the way it handle text file might have thing that i do not aware)
Thanks
log4net or any other generic logger is helpful if
1) you want to have a consistent logging facility in many places across your application; and/or
2) you want the ability to customize logging format, level and so on.
From your description it sounds like there is a single point in your app where you need to log the exception in a specific way. If this is correct, you will probably gain no benefit from creating a custom logger - just write a method that logs exception to a file in the way you need.
If I misunderstood you, and there is a need for generic logger (that is, either 1) or 2) above is true), extending log4net by inheriting a logger or creating a wrapper is fine.
I've created log4net wrappers before. I find it handy to start this way as you don't always know what the logging requirements are at the start of a project. My rule has been that the log4net library can only be referenced from my own "logging" namespace. This way, the application code only calls the wrapper, and the wrapper is the only point of contact to the log4net functionality.
In the long run, it's probably worth investing in building your own logger. If you encapsulate log4net properly, you should be able to make this upgrade rather easily, without having to change your code.
Why not use Trace Listeners from the .NET framework? They provide many of the benefits of a logging network, without the need to incorporate an external framework.
Benefits include centralized log management and the ability to direct the output logs to one or more sources such as a console window, text file, or the Windows Event Log.
You should spend some time creating your own logger that does exactly what you want. This would be the best way. Is also fairly easy and you have full control on the customization so you can make the output look and feel as in log4net. You could Google for logging sample and start modifying that one.
I am not sure if I would use a log framework for this purpose. I have the impression that writing this text file in the exception case is part of your business process. Logging serves a different purpose that can be turned off without affecting business processes...

Logging custom classes through WebService using NLog

Problem is as follows:
On log event I want to send my custom object (lets say LogMessage that wraps in some way logging event) to my web service. Could work like appenders in log4net, or is there this kind of thing in Nlog btw? Or how do I do this NLog way?
Note: I'm using WebService target wrapper (if this helps in any way).
[EDIT]
I have added some links rather than simply telling you where to look.
NLog has a LogReceiverService and a LogReceiverServiceTarget (these might have been added for NLog 2.0 which just went to Beta recently). From what I can tell, one way to use the service is to use NLog for logging in your app. Configure to send all logging messages to LogReceiverTarget. Configure LogReceiverTarget to point to the LogReceiverService. LogReceiverTarget will create "NLogEvents" from log messages and forward them to the LogReceiverService. LogReceiverService will convert "NLogEvents" back to LogEvents and log them via NLog. In other words, you are logging via NLog in your app and LogReceiverService is also logging via NLog.
I am posting from iPhone so it is harder for me to add links to the relevant NLog topics. Go to NLog website and look for documentation on LogReceiverService. Also look in the forum. There has been some traffic recently on LogReceiverService. Finally, if you google "nlog git" you will find NLog's git source repository (for LogReceiverService specifically). You might be able to learn something there.
Good luck!
I have an example using a wcf service (ILogReceiverServer), it might be useful
https://bitbucket.org/philipogorman/logreceiverserviceexample/src

Categories