50 private string RootDirectory {
get;
set; }
51 private DirectoryStructure DirectoryStructure {
get;
set; }
52 private string Filename {
get;
set; }
53 private FilenamePattern FilenamePattern {
get;
set; }
54 private string Delimiter {
get;
set; }
56 private LogDateFormat LogDateFormat {
get;
set; } = LogDateFormat.NOTSET;
57 private bool LogDateAsAttribute {
get;
set; } =
false;
75 private bool noTargetReported =
false;
81 private LogType LogType {
get;
set; } = LogType.INFO;
82 private GPALEventType LogEventTypes {
get;
set; } = GPALEventType.All;
100 RootDirectory = Directory.GetCurrentDirectory();
101 DirectoryStructure = DirectoryStructure.None;
102 FilenamePattern = FilenamePattern.None;
120 LogEventTypes = logEventTypes;
148 RootDirectory = path;
160 DirectoryStructure = type;
184 FilenamePattern = pattern;
195 Delimiter = delimiter.ToString();
196 converter.ConverterSettings.InDelimiter = delimiter;
207 LogDateFormat = logDateFormat;
218 LogDateAsAttribute = logDateAsAttribute;
227 private string GetLogFilePath()
230 string year = DateTime.Now.ToString(
"yyyy");
231 string month = DateTime.Now.ToString(
"MM");
232 string day = DateTime.Now.ToString(
"dd");
233 string hr = DateTime.Now.ToString(
"HH");
234 string julian = DateTime.Now.DayOfYear.ToString(
"000");
238 Directory.CreateDirectory(logDirectory);
241 switch (DirectoryStructure)
243 case DirectoryStructure.YM:
245 logDirectory = Path.Combine(logDirectory, year);
246 Directory.CreateDirectory(logDirectory);
248 logDirectory = Path.Combine(logDirectory, month);
249 Directory.CreateDirectory(logDirectory);
252 case DirectoryStructure.YMD:
254 logDirectory = Path.Combine(logDirectory, year);
255 Directory.CreateDirectory(logDirectory);
257 logDirectory = Path.Combine(logDirectory, month);
258 Directory.CreateDirectory(logDirectory);
260 logDirectory = Path.Combine(logDirectory, day);
261 Directory.CreateDirectory(logDirectory);
263 case DirectoryStructure.YMDH:
265 logDirectory = Path.Combine(logDirectory, year);
266 Directory.CreateDirectory(logDirectory);
268 logDirectory = Path.Combine(logDirectory, month);
269 Directory.CreateDirectory(logDirectory);
271 logDirectory = Path.Combine(logDirectory, day);
272 Directory.CreateDirectory(logDirectory);
274 logDirectory = Path.Combine(logDirectory, hr);
275 Directory.CreateDirectory(logDirectory);
277 case DirectoryStructure.MDH:
278 logDirectory = Path.Combine(logDirectory, month);
279 Directory.CreateDirectory(logDirectory);
281 logDirectory = Path.Combine(logDirectory, day);
282 Directory.CreateDirectory(logDirectory);
284 logDirectory = Path.Combine(logDirectory, hr);
285 Directory.CreateDirectory(logDirectory);
287 case DirectoryStructure.MD:
288 logDirectory = Path.Combine(logDirectory, month);
289 Directory.CreateDirectory(logDirectory);
291 logDirectory = Path.Combine(logDirectory, day);
292 Directory.CreateDirectory(logDirectory);
294 case DirectoryStructure.M:
295 logDirectory = Path.Combine(logDirectory, month);
296 Directory.CreateDirectory(logDirectory);
298 case DirectoryStructure.DH:
299 logDirectory = Path.Combine(logDirectory, day);
300 Directory.CreateDirectory(logDirectory);
302 logDirectory = Path.Combine(logDirectory, hr);
303 Directory.CreateDirectory(logDirectory);
305 case DirectoryStructure.D:
306 logDirectory = Path.Combine(logDirectory, day);
307 Directory.CreateDirectory(logDirectory);
309 case DirectoryStructure.H:
310 logDirectory = Path.Combine(logDirectory, hr);
311 Directory.CreateDirectory(logDirectory);
313 case DirectoryStructure.Julian:
314 logDirectory = Path.Combine(logDirectory, julian);
315 Directory.CreateDirectory(logDirectory);
317 case DirectoryStructure.None:
320 GPAL.
PublishSimpleEvent(GPALEventType.WARNING, $
"Unable to figure out directory structure [{DirectoryStructure}]",
this, GPALObjectType.Logger);
325 string timestamp =
string.Empty;
326 string fileExtension = Filename.Split(
'.').Last();
327 string filenameWithoutExtension = Filename.Substring(0, Filename.LastIndexOf(
'.'));
329 switch (FilenamePattern)
331 case FilenamePattern.YMDHMSm:
332 timestamp = DateTime.Now.ToString(
"yyyyMMddHHmmssfff");
334 case FilenamePattern.YMDHMS:
335 timestamp = DateTime.Now.ToString(
"yyyyMMddHHmmss");
337 case FilenamePattern.YMDHM:
338 timestamp = DateTime.Now.ToString(
"yyyyMMddHHmm");
340 case FilenamePattern.YMDH:
341 timestamp = DateTime.Now.ToString(
"yyyyMMddHH");
343 case FilenamePattern.YMD:
344 timestamp = DateTime.Now.ToString(
"yyyyMMdd");
346 case FilenamePattern.YM:
347 timestamp = DateTime.Now.ToString(
"yyyyMM");
349 case FilenamePattern.MM:
350 timestamp = DateTime.Now.ToString(
"MM");
352 case FilenamePattern.Y:
353 timestamp = DateTime.Now.ToString(
"yyyy");
355 case FilenamePattern.MDHMSm:
356 timestamp = DateTime.Now.ToString(
"MMddHHmmssfff");
358 case FilenamePattern.MDHMS:
359 timestamp = DateTime.Now.ToString(
"MMddHHmmss");
361 case FilenamePattern.MDHM:
362 timestamp = DateTime.Now.ToString(
"MMddHHmm");
364 case FilenamePattern.MDH:
365 timestamp = DateTime.Now.ToString(
"MMddHH");
367 case FilenamePattern.DHMSm:
368 timestamp = DateTime.Now.ToString(
"ddHHmmssfff");
370 case FilenamePattern.DHMS:
371 timestamp = DateTime.Now.ToString(
"ddHHmmss");
373 case FilenamePattern.DHM:
374 timestamp = DateTime.Now.ToString(
"ddHHmm");
376 case FilenamePattern.DH:
377 timestamp = DateTime.Now.ToString(
"ddHH");
379 case FilenamePattern.D:
380 timestamp = DateTime.Now.Day.ToString();
382 case FilenamePattern.HMSm:
383 timestamp = DateTime.Now.ToString(
"HHmmssfff");
385 case FilenamePattern.HMS:
386 timestamp = DateTime.Now.ToString(
"HHmmss");
388 case FilenamePattern.HM:
389 timestamp = DateTime.Now.ToString(
"HHmm");
391 case FilenamePattern.H:
392 timestamp = DateTime.Now.ToString(
"HH");
394 case FilenamePattern.MSm:
395 timestamp = DateTime.Now.ToString(
"mmssfff");
397 case FilenamePattern.MS:
398 timestamp = DateTime.Now.ToString(
"mmss");
400 case FilenamePattern.M:
401 timestamp = DateTime.Now.ToString(
"mm");
403 case FilenamePattern.Sm:
404 timestamp = DateTime.Now.ToString(
"ssfff");
406 case FilenamePattern.S:
407 timestamp = DateTime.Now.ToString(
"ss");
409 case FilenamePattern.m:
410 timestamp = DateTime.Now.ToString(
"fff");
412 case FilenamePattern.Julian:
415 case FilenamePattern.None:
416 return Path.Combine(logDirectory, Filename);
418 GPAL.PublishSimpleEvent(GPALEventType.WARNING, $
"Unable to determine filename patter [{FilenamePattern}]. Using [{Filename}].",
this, GPALObjectType.Logger);
419 return Path.Combine(logDirectory, Filename);
422 if (!
string.IsNullOrEmpty(timestamp))
423 filenameWithoutExtension = $
"{filenameWithoutExtension}_{timestamp}";
425 return Path.Combine(logDirectory, $
"{filenameWithoutExtension}.{fileExtension}");
437 case LogDateFormat.YMD_HMS:
438 return "yyyy-MM-dd HH:mm:ss";
439 case LogDateFormat.YMD_HMS_FFF:
440 return "yyyy-MM-dd HH:mm:ss.fff";
441 case LogDateFormat.DMY_HMS:
442 return "dd-MM-yyyy HH:mm:ss";
443 case LogDateFormat.MDY_HMS:
444 return "MM-dd-yyyy HH:mm:ss";
445 case LogDateFormat.DMY:
447 case LogDateFormat.MDY:
449 case LogDateFormat.YMD:
451 case LogDateFormat.HMS:
453 case LogDateFormat.HM:
455 case LogDateFormat.MDY_Long:
456 return "MMMM dd, yyyy";
458 throw new ArgumentException(
"Unknown LogDateFormat value");
483 private static readonly
object writeLock =
new object();
490 WriteEntry(logThis, raisedBy, entryType);
495 private void WriteEntry(
string logThis,
string raisedBy, LogType entryType)
499 if (
false == Enum.TryParse(entryType.ToString(), out GPALEventType logEventType) ||
false == LogEventTypes.HasFlag(logEventType))
502 DateTime currentDate = DateTime.Now;
503 string formattedDate;
504 string logFilePath =
null;
508 string name = raisedBy;
510 if (
true ==
string.IsNullOrEmpty(name))
512 var st =
new StackTrace();
513 var sf = st.GetFrame(1);
515 name = sf.GetMethod().Name;
517 if (name.Equals(
"MoveNext"))
520 name = sf.GetMethod().ReflectedType.Name
521 .Split(
new char[] {
'<',
'>' }, StringSplitOptions.RemoveEmptyEntries)[0];
527 List<string> entries =
new List<string> { logThis ??
"NULL" };
529 if (
null != Filename)
531 logFilePath = GetLogFilePath();
541 if (LogDateFormat.NOTSET != LogDateFormat)
542 formattedDate =
string.Format(
"{0:" +
GetFormatString(LogDateFormat) +
"}", currentDate);
544 formattedDate =
string.Format(
"{0:" +
GetFormatString(LogDateFormat.MDY_HMS) +
"}", currentDate);
552 string separator = $
" {Delimiter ?? "|
"} ";
553 StringBuilder lines =
new StringBuilder();
555 foreach (
string entry
in entries)
556 lines.Append($
"{formattedDate}{separator}{entryType}{separator}{name}{separator}{entry}{Environment.NewLine}");
558 File.AppendAllText(logFilePath, lines.ToString());
560 else if (
null != Database)
565 IGPALGrid<string> rows = GPAL.Grid.ToGPALObject();
567 foreach (
string entry
in entries)
568 rows.AddRow(
new List<string> { $
"{entryType} {Delimiter ?? "|
"} {entry}" });
570 converter.WithInput(rows);
571 converter.SaveTo(Database);
573 else if (
false == noTargetReported)
577 noTargetReported =
true;
579 GPAL.PublishSimpleEvent(GPALEventType.ERROR, $
"Nothing logged: this logger was given no file and no database to write to",
this, GPALObjectType.Logger);
587 private int GetWeekNumber(DateTime date)
589 return (date.DayOfYear - 1) / 7 + 1;