I'm working with Orchard CMS and it is better CMS for me. I want to understand how it does the logging and whether I can add my own logging or not. I saw that Orchard uses NullLogger
class and it does no work. I've opened the App_Data.Logs folder and have seen that there are the log files. But how? I searched in code where is the trick that replaces NullLogger
with log4net (I guess this is log4net, because the log format and the formatting for log4net.config are very similar) but I haven't found this.
Can somebody answer me:
- How Orchard does the logging?
- Whether I can add my own logger and if yes what best practices exist to do this?
Thanks, Andrey.
An Autofac module (
Orchard.Logging.LoggerModule
to be precise) handles that. Basically - it scans each dependency and fills all properties of typeILogger
with a reference to appropriate logger instance. Each dependency gets its own logger with name equal to full type name (including namespace) of a containing class.The
NullLogger
is just a placeholder so accessing the property would not throwNullReferenceException
s before the property is being set by Autofac.Extending the default logging is a rather complicated task as it would involve doing three things:
LoggerModule
does)[OrchardSuppressDependency("Orchard.Logging.LoggingModule")]
UPDATE
Just realized I haven't addressed the most important part of the question here:) Yes, Orchard uses log4net so you may alter the default settings via Config/log4net.config file.
There is a great article on how Orchard Logging works. (I am not sure if it is ok to copy and paste the entire article). This is the link: Injection Logger in Orchard
So the trick is this:
And how is this done?
In a few words, it looks all the code in all projects, gets all the classes that use an ILogger property, and implements it for you (if not implemented), using Castle's logger factory.