49 private string RootDirectory {
get;
set; }
50 private DirectoryStructure DirectoryStructure {
get;
set; }
51 private string Filename {
get;
set; }
52 private FilenamePattern FilenamePattern {
get;
set; }
53 private string Delimiter {
get;
set; }
55 private LogDateFormat LogDateFormat {
get;
set; } = LogDateFormat.NOTSET;
73 private bool noTargetReported =
false;
79 private GPALEventType LogEventTypes {
get;
set; } = GPALEventType.All;
97 RootDirectory = Directory.GetCurrentDirectory();
98 DirectoryStructure = DirectoryStructure.None;
99 FilenamePattern = FilenamePattern.None;
111 LogEventTypes = logEventTypes;
134 RootDirectory = path;
146 DirectoryStructure = type;
170 FilenamePattern = pattern;
181 Delimiter = delimiter.ToString();
182 converter.ConverterSettings.InDelimiter = delimiter;
193 LogDateFormat = logDateFormat;
202 private string GetLogFilePath()
205 string year = DateTime.Now.ToString(
"yyyy");
206 string month = DateTime.Now.ToString(
"MM");
207 string day = DateTime.Now.ToString(
"dd");
208 string hr = DateTime.Now.ToString(
"HH");
209 string julian = DateTime.Now.DayOfYear.ToString(
"000");
213 Directory.CreateDirectory(logDirectory);
216 switch (DirectoryStructure)
218 case DirectoryStructure.YM:
220 logDirectory = Path.Combine(logDirectory, year);
221 Directory.CreateDirectory(logDirectory);
223 logDirectory = Path.Combine(logDirectory, month);
224 Directory.CreateDirectory(logDirectory);
227 case DirectoryStructure.YMD:
229 logDirectory = Path.Combine(logDirectory, year);
230 Directory.CreateDirectory(logDirectory);
232 logDirectory = Path.Combine(logDirectory, month);
233 Directory.CreateDirectory(logDirectory);
235 logDirectory = Path.Combine(logDirectory, day);
236 Directory.CreateDirectory(logDirectory);
238 case DirectoryStructure.YMDH:
240 logDirectory = Path.Combine(logDirectory, year);
241 Directory.CreateDirectory(logDirectory);
243 logDirectory = Path.Combine(logDirectory, month);
244 Directory.CreateDirectory(logDirectory);
246 logDirectory = Path.Combine(logDirectory, day);
247 Directory.CreateDirectory(logDirectory);
249 logDirectory = Path.Combine(logDirectory, hr);
250 Directory.CreateDirectory(logDirectory);
252 case DirectoryStructure.MDH:
253 logDirectory = Path.Combine(logDirectory, month);
254 Directory.CreateDirectory(logDirectory);
256 logDirectory = Path.Combine(logDirectory, day);
257 Directory.CreateDirectory(logDirectory);
259 logDirectory = Path.Combine(logDirectory, hr);
260 Directory.CreateDirectory(logDirectory);
262 case DirectoryStructure.MD:
263 logDirectory = Path.Combine(logDirectory, month);
264 Directory.CreateDirectory(logDirectory);
266 logDirectory = Path.Combine(logDirectory, day);
267 Directory.CreateDirectory(logDirectory);
269 case DirectoryStructure.M:
270 logDirectory = Path.Combine(logDirectory, month);
271 Directory.CreateDirectory(logDirectory);
273 case DirectoryStructure.DH:
274 logDirectory = Path.Combine(logDirectory, day);
275 Directory.CreateDirectory(logDirectory);
277 logDirectory = Path.Combine(logDirectory, hr);
278 Directory.CreateDirectory(logDirectory);
280 case DirectoryStructure.D:
281 logDirectory = Path.Combine(logDirectory, day);
282 Directory.CreateDirectory(logDirectory);
284 case DirectoryStructure.H:
285 logDirectory = Path.Combine(logDirectory, hr);
286 Directory.CreateDirectory(logDirectory);
288 case DirectoryStructure.Julian:
289 logDirectory = Path.Combine(logDirectory, julian);
290 Directory.CreateDirectory(logDirectory);
292 case DirectoryStructure.None:
295 GPAL.
PublishSimpleEvent(GPALEventType.WARNING, $
"Unable to figure out directory structure [{DirectoryStructure}]",
this, GPALObjectType.Logger);
300 string timestamp =
string.Empty;
301 string fileExtension = Filename.Split(
'.').Last();
302 string filenameWithoutExtension = Filename.Substring(0, Filename.LastIndexOf(
'.'));
304 switch (FilenamePattern)
306 case FilenamePattern.YMDHMSm:
307 timestamp = DateTime.Now.ToString(
"yyyyMMddHHmmssfff");
309 case FilenamePattern.YMDHMS:
310 timestamp = DateTime.Now.ToString(
"yyyyMMddHHmmss");
312 case FilenamePattern.YMDHM:
313 timestamp = DateTime.Now.ToString(
"yyyyMMddHHmm");
315 case FilenamePattern.YMDH:
316 timestamp = DateTime.Now.ToString(
"yyyyMMddHH");
318 case FilenamePattern.YMD:
319 timestamp = DateTime.Now.ToString(
"yyyyMMdd");
321 case FilenamePattern.YM:
322 timestamp = DateTime.Now.ToString(
"yyyyMM");
324 case FilenamePattern.MM:
325 timestamp = DateTime.Now.ToString(
"MM");
327 case FilenamePattern.Y:
328 timestamp = DateTime.Now.ToString(
"yyyy");
330 case FilenamePattern.MDHMSm:
331 timestamp = DateTime.Now.ToString(
"MMddHHmmssfff");
333 case FilenamePattern.MDHMS:
334 timestamp = DateTime.Now.ToString(
"MMddHHmmss");
336 case FilenamePattern.MDHM:
337 timestamp = DateTime.Now.ToString(
"MMddHHmm");
339 case FilenamePattern.MDH:
340 timestamp = DateTime.Now.ToString(
"MMddHH");
342 case FilenamePattern.DHMSm:
343 timestamp = DateTime.Now.ToString(
"ddHHmmssfff");
345 case FilenamePattern.DHMS:
346 timestamp = DateTime.Now.ToString(
"ddHHmmss");
348 case FilenamePattern.DHM:
349 timestamp = DateTime.Now.ToString(
"ddHHmm");
351 case FilenamePattern.DH:
352 timestamp = DateTime.Now.ToString(
"ddHH");
354 case FilenamePattern.D:
355 timestamp = DateTime.Now.Day.ToString();
357 case FilenamePattern.HMSm:
358 timestamp = DateTime.Now.ToString(
"HHmmssfff");
360 case FilenamePattern.HMS:
361 timestamp = DateTime.Now.ToString(
"HHmmss");
363 case FilenamePattern.HM:
364 timestamp = DateTime.Now.ToString(
"HHmm");
366 case FilenamePattern.H:
367 timestamp = DateTime.Now.ToString(
"HH");
369 case FilenamePattern.MSm:
370 timestamp = DateTime.Now.ToString(
"mmssfff");
372 case FilenamePattern.MS:
373 timestamp = DateTime.Now.ToString(
"mmss");
375 case FilenamePattern.M:
376 timestamp = DateTime.Now.ToString(
"mm");
378 case FilenamePattern.Sm:
379 timestamp = DateTime.Now.ToString(
"ssfff");
381 case FilenamePattern.S:
382 timestamp = DateTime.Now.ToString(
"ss");
384 case FilenamePattern.m:
385 timestamp = DateTime.Now.ToString(
"fff");
387 case FilenamePattern.Julian:
390 case FilenamePattern.None:
391 return Path.Combine(logDirectory, Filename);
393 GPAL.PublishSimpleEvent(GPALEventType.WARNING, $
"Unable to determine filename patter [{FilenamePattern}]. Using [{Filename}].",
this, GPALObjectType.Logger);
394 return Path.Combine(logDirectory, Filename);
397 if (!
string.IsNullOrEmpty(timestamp))
398 filenameWithoutExtension = $
"{filenameWithoutExtension}_{timestamp}";
400 return Path.Combine(logDirectory, $
"{filenameWithoutExtension}.{fileExtension}");
412 case LogDateFormat.YMD_HMS:
413 return "yyyy-MM-dd HH:mm:ss";
414 case LogDateFormat.YMD_HMS_FFF:
415 return "yyyy-MM-dd HH:mm:ss.fff";
416 case LogDateFormat.DMY_HMS:
417 return "dd-MM-yyyy HH:mm:ss";
418 case LogDateFormat.MDY_HMS:
419 return "MM-dd-yyyy HH:mm:ss";
420 case LogDateFormat.DMY:
422 case LogDateFormat.MDY:
424 case LogDateFormat.YMD:
426 case LogDateFormat.HMS:
428 case LogDateFormat.HM:
430 case LogDateFormat.MDY_Long:
431 return "MMMM dd, yyyy";
433 throw new ArgumentException(
"Unknown LogDateFormat value");
457 private static readonly
object writeLock =
new object();
464 WriteEntry(logThis, raisedBy, entryType);
469 private void WriteEntry(
string logThis,
string raisedBy, LogType entryType)
473 if (
false == Enum.TryParse(entryType.ToString(), out GPALEventType logEventType) ||
false == LogEventTypes.HasFlag(logEventType))
476 DateTime currentDate = DateTime.Now;
477 string formattedDate;
478 string logFilePath =
null;
482 string name = raisedBy;
484 if (
true ==
string.IsNullOrEmpty(name))
486 var st =
new StackTrace();
487 var sf = st.GetFrame(1);
489 name = sf.GetMethod().Name;
491 if (name.Equals(
"MoveNext"))
494 name = sf.GetMethod().ReflectedType.Name
495 .Split(
new char[] {
'<',
'>' }, StringSplitOptions.RemoveEmptyEntries)[0];
501 List<string> entries =
new List<string> { logThis ??
"NULL" };
503 if (
null != Filename)
505 logFilePath = GetLogFilePath();
515 if (LogDateFormat.NOTSET != LogDateFormat)
516 formattedDate =
string.Format(
"{0:" +
GetFormatString(LogDateFormat) +
"}", currentDate);
518 formattedDate =
string.Format(
"{0:" +
GetFormatString(LogDateFormat.MDY_HMS) +
"}", currentDate);
526 string separator = $
" {Delimiter ?? "|
"} ";
527 StringBuilder lines =
new StringBuilder();
529 foreach (
string entry
in entries)
530 lines.Append($
"{formattedDate}{separator}{entryType}{separator}{name}{separator}{entry}{Environment.NewLine}");
532 File.AppendAllText(logFilePath, lines.ToString());
534 else if (
null != Database)
539 IGPALGrid<string> rows = GPAL.Grid.ToGPALObject();
541 foreach (
string entry
in entries)
542 rows.AddRow(
new List<string> { $
"{entryType} {Delimiter ?? "|
"} {entry}" });
544 converter.WithInput(rows);
545 converter.SaveTo(Database);
547 else if (
false == noTargetReported)
551 noTargetReported =
true;
553 GPAL.PublishSimpleEvent(GPALEventType.ERROR, $
"Nothing logged: this logger was given no file and no database to write to",
this, GPALObjectType.Logger);
561 private int GetWeekNumber(DateTime date)
563 return (date.DayOfYear - 1) / 7 + 1;