Skip to content

rocklau/logger

 
 

Repository files navigation

deno-logger

logger for deno

Logger interface

interface fileLoggerOptions {
  rotate?: boolean;  // cut by day
  now?: boolean; // print datetime or not
  maxBytes?: number, // the maximum size in bytes that the log file can grow to before rolling over to a new one
  maxBackupCount?: number // maxBackupCount must work with maxBytes
}

interface LoggerInerface {
  constructor() {}

  info(...args: unknown[]): void
  warn(...args: unknown[]): void
  error(...args: unknown[]): void

  async initFileLogger(dir: string, options: fileLoggerOptions = {}): Promise<void>

  disableConsole(): void
  enableConsole(): void

  disableFile(): void;
  enableFile(): void;

  disable(): void;
  enable(): void;
}

Useage

console logger

import Logger from "https://deno.land/x/logger@v1.0.0/logger.ts";

const logger = new Logger();

logger.info('i am from consoleLogger', { name: 'zfx' });
logger.warn('i am from consoleLogger', 1, 'any');
logger.error('i am from consoleLogger', new Error('test'));

file and console logger

import Logger from "https://deno.land/x/logger@v1.0.0/logger.ts";

const logger = new Logger();

// console only
logger.info('i am from consoleLogger', { name: 'zfx' });
logger.warn('i am from consoleLogger', 1, 'any');
logger.error('i am from consoleLogger', new Error('test'));

await logger.initFileLogger('../log');

// file and console
logger.info('i am from fileLogger', { name: 'zfx' });
logger.warn('i am from fileLogger', 1, 'any');
logger.error('i am from fileLogger', new Error('test'));

file logger only

import Logger from "https://deno.land/x/logger@v1.0.0/logger.ts";

const logger = new Logger();
await logger.initFileLogger('../log');
logger.disableConsole();

// file only
logger.info(['i am from fileLogger', 1], { name: 'zfx' });

file logger optional parameter

interface

interface fileLoggerOptions {
  rotate?: boolean,  // cut by day
  maxBytes?: number; 
  // Only available if maxBytes is provided, Otherwise you will get an error
  maxBackupCount?: number; 
}

example

import Logger from "https://deno.land/x/logger@v1.0.0/logger.ts";
const logger = new Logger();

// cut by day
// filename is [date]_[type].log
// example 2020-05-25_warn.log, 2020-05-25_info.log, 2020-05-25_error.log
await logger.initFileLogger('../log', {
  rotate: true
});

// maxBytes
// filename is [type].log.[timestamp]
// example: info.log.1590374415956
await logger.initFileLogger('../log', {
  maxBytes: 10 * 1024
});

// rotate and maxBytes
// filename is [date]_[type].log.[timestamp]
// example: 2020-05-25_info.log.1590374415956
await logger.initFileLogger('../log', {
  rotate: true, 
  maxBytes: 10 * 1024
});

// maxBytes and maxBackupCount
// filename is [type].log.[n] 
// example info.log.1, info.log.2 ...
// when reach maxBackupCount, the [type].log.[maxBackupCount-1] will be overwrite
/* 
 detail: 
`maxBytes` specifies the maximum size
in bytes that the log file can grow to before rolling over to a new one. If the
size of the new log message plus the current log file size exceeds `maxBytes`
then a roll over is triggered. When a roll over occurs, before the log message
is written, the log file is renamed and appended with `.1`. If a `.1` version
already existed, it would have been renamed `.2` first and so on. The maximum
number of log files to keep is specified by `maxBackupCount`. After the renames
are complete the log message is written to the original, now blank, file.

Example: Given `log.txt`, `log.txt.1`, `log.txt.2` and `log.txt.3`, a
`maxBackupCount` of 3 and a new log message which would cause `log.txt` to
exceed `maxBytes`, then `log.txt.2` would be renamed to `log.txt.3` (thereby
discarding the original contents of `log.txt.3` since 3 is the maximum number of
backups to keep), `log.txt.1` would be renamed to `log.txt.2`, `log.txt` would
be renamed to `log.txt.1` and finally `log.txt` would be created from scratch
where the new log message would be written.
*/
await logger.initFileLogger('../log', {
  maxBytes: 10 * 1024, 
  maxBackupCount: 10  
});

// rotate and maxBytes and maxBackupCount
// filename is [date]_[type].log.[n]
// example 2020-05-25_info.log.1, 2020-05-25_info.log.2
// when reach maxBackupCount, the [type].log.[maxBackupCount-1] will be overwrite
await logger.initFileLogger('../log', {
  rotate: true,  
  maxBytes: 10 * 1024, 
  maxBackupCount: 10 
});

// rotate and maxBackupCount
// maxBackupCount will be ignored
await logger.initFileLogger('../log', {
  rotate: true,  
  maxBackupCount: 10 
});

The following conditions will throw an error

// maxBackupCount
// get error => maxBackupCount must work with maxBytes
await logger.initFileLogger('../log', {
  maxBackupCount: 10 
});
// rotate and maxBackupCount
// get error => maxBackupCount must work with maxBytes
await logger.initFileLogger('../log', {
  rotate: true,
  maxBackupCount: 10 
});

disableConsole and enableConsole

import Logger from "https://deno.land/x/logger@v1.0.0/logger.ts";

const logger = new Logger();

// console
logger.info('console enabled, you can see me');
logger.disableConsole();
// no message is logged
logger.info('console disabled');
logger.enableConsole();
// console
logger.info('console enabled, you can see me');

disableFile and enableFile

import Logger from "https://deno.land/x/logger@v1.0.0/logger.ts";

const logger = new Logger();
await logger.initFileLogger('../log');

logger.disableFile();
// not log to file
logger.info('file disbaled');
logger.enableFile();
// log to file
logger.info('file enabled, you can see me');

disable and enable

  • disable disable write to file and terminal, don't care if it is currently writing to a file or terminal, but hope to restore the currently configuration later
  • enable restore previous log configuration: file, terminal or both

example:

  1. fileLogger => disable => enable => fileLogger
  2. consoleLogger => disable => enable => consoleLogger
  3. fileLogger, consoleLogger => disable => enable => fileLogger, consoleLogger
import Logger from "https://deno.land/x/logger@v1.0.0/logger.ts";

const logger = new Logger();
await logger.initFileLogger('../log');

logger.disable();
logger.enable();

test

deno test --allow-read --allow-write

Screenshots

consoleLogger
consoleLogger

fileLogger
fileLogger

cut logs by day
CutByDay

More screenshots in the screenshots folder.

About

logger for deno

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • TypeScript 100.0%