You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4net-dev@logging.apache.org by "de la Torre, Douglas" <de...@ugs.com> on 2004/09/08 03:31:36 UTC
Log4net enhancements
Hi All,
I'm interested in feedback about some (potential) enhancements to
log4net that would make it more robust in production ASP.NET
environments.
I'm willing to write the code and test it, then submit back to this
public forum once things are debugged, but wanted to get feedback before
starting to see if this makes sense to pursue.
-Doug
Doug de la Torre
Lead Developer
UGS
Log4net enhancements:
1) Allow log4net to format (like string.Format) in .Debug, .Info,
.Warn, etc.
(Already submitted code to do this in a previous post...but
worth mentioning all the same)
lets you use
log.Debug( "message with param {0} and param {1}",
param1, param2 );
instead of
log.Debug( string.Format( "message with param {0} and
param {1}", param1, param2 ) );
2) Allow log4net to impersonate a user via app-specific mechanism.
Currently, log4net opens files as the user who logs a message.
This means on a site with
lots of users, in order to ensure fail-safe logging, all users
must have full permissions
to the folder where logging occurs. This is problematic, since
customers are reluctant
to open up folders will full access, and when they are willing,
it is still tough to keep
permissions on the folder in-sync with all the site users. If
even one user doesn't have
full permissions, logging can fail (and stop thereafter) for all
users.
Impact would be to the RollingFileAppender and the FileAppender
classes.
How?
Introduce a FileFactory mechanism, and specify the type via the
XML config file.
Most users would see no difference, but this would give us a
point of flexibility
to control how file I/O is done.
Default factory does what log4net currently does (all file I/O
done as current user)
When there is no XML override, then it falls back to using the
current approach of file I/O,
using a 'default' factory (which would do raw file I/O).
Our application could could override via config XML
<log4net>
<fileFactory
type="Customer.Specified.MyFileFactory,mydll" />
</log4net>
Our application's file factory could implement IFileFactory
public interface IFileFactory
{
void CreateDirectory( string directoryToFile );
StreamWriter OpenFile( string fileName, bool
append, string encoding );
IFileInfo NewFileInfo( string fileName );
}
Then, when the IFileFactory methods are called, we could do
impersonation around the file
I/O, allowing the logfile to be created using a single account.
By ensuring that one account
has full permissions on the log folder, it is easier to ensure
logging will always succeed
for all users.
Note that the messages themselves would still be logged as the
windows identity of the user that
was running when the message was logged. Only the file creation
(or deletion) would go through a
factory, allowing those operations to be done differently if
needed.
Need to impersonate for the FileInfo.Delete, FileInfo.MoveTo
checks, as well as the OpenFile call,
and FileInfo.Directory.GetFiles
Since FileInfo is sealed, need to create wrapper interfaces for
common file actions:
public interface IFileInfo
{
bool Exists { get; }
long Length { get; }
string DirectoryName { get; }
IDirectoryInfo Directory { get; }
DateTime LastWriteTime { get; }
void Delete();
void MoveTo( string destinationFile );
}
public interface IDirectoryInfo
{
bool Exists { get; }
IFileInfo[] GetFiles( string wildcardPattern );
}
3) Allow log4net to retry if a file I/O fails
This partially addresses issues with multiple users when some
don't have permissions.
By adding ability to try (if no logger is currently assigned),
it could stand back
up if logging failed (for a user that doesn't have permissions),
allowing messages
for a user that did to start logging again.
Currently, if the user doesn't have permissions to open the
file, the appender
shuts down and never logs a message after that. I like to call
this a 'black hole',
since it only takes one of the problems below to occur before
logging can stop forever
and never recover, thus making it unreliable in a production
environment.
I've seen this happen for these conditions:
1) The log file is already open when log4net tries to open it
- This happens more frequently with RollingFileAppender
since it does lots of open/closes
2) An app that uses impersionation (like an ASP.NET app with
Windows authentication)
has users from different permission groups, and not all
users have permission to the
folder where log files are recorded
Impact would be in the FileAppender and RollingFileAppender
classes.