what I can tell you is that I do not like the API I did for extending Log in SystemLogger.

I will try to read your long email.

Now I have the impression that wrapping an object in the log could be a way to offer extensibility.


Le 26/4/16 à 15:26, Denis Kudriashov a écrit :
Hello.

I resumed discussion about SystemLogger and Beacon here http://forum.world.st/What-the-state-of-unifying-Beacon-with-SystemLogger-td4890684.html. I plan to unify both approaches by saving traditional terminology from SystemLogger and cool features from Beacon.

Let's think about logging API to log any object in the system. Most natural way is just send message #log to object itself:

    anObject log


It would be nice replacement for Object>>logCr.
But when we log some information we usually want to log it with little remark, importance level and (most important) timestamp. This information is kind of standard for logging domain. But it requires much more methods for logging API.
So we need extra information to put together with objects:

 1. timestamp
 2. user message
 3. importance level (debug, info, error, etc.)
 4. whatever (process hash, process name for example)
 5. sometimes it can be needed to put in log something different than
    object itself. (for example it can be just copy of object to not
    change state of log entry during app lifetime)

Here is possible API based on Object extensions. It has drawbacks but it is good to think about it too:

    "it will put anObject in logs with default #info level"

    anObject log

    "it will put anObject in logs with default #info level and given
    user message"
    anObject logWith: 'something interesting was happened with anObject'

     "inside block we can put any logging domain information from
    application and also override content by specific representation"
    anObject logBy: [:logEntry |

          logEntry message: 'something interesting to be saved with
    our object'

          logEntry content: anotherObject] "here logs with interest
    about anObject will receive logEntry with anotherObject instead of
    anObject"


And similar for different kind of levels:

    anObject logForDebug.
    anObject logForDebugWith: 'some debug message'
    anObject logForDebugBy: [:logEntry | ]


    anObject logAsError.
    anObject logAsError: 'object computation was wrong'
    anObject logAsErrorBy: [:logEntry | ]

And most general:

    anObject logAs: LogLevel warn

    anObject logAs: LogLevel warn with:  'something interesting'
    anObject logAs: LogLevel warn by: [:logEntry | ]


And in case of classic logging with strings only first expressions would be used:

    'some info message' log.
    'some debug message' logForDebug
    'some error message' logAsError
    'some warn message' logAs: LogLevel warn

Problem with this approach: it pollutes Object with 12 extra methods and it can be more. So maybe it is better to use current SystemLogger API based on class Log:

    Log info: anObject
    Log info: anObject as: 'computation result'  "as example"
    Log info: anObject as: [:logEntry |

        logEntry message: 'something interesting to be saved with our
        object

        logEntry content: anotherObject]


    Log error: anObject

    Log error: anObject as: 'computation was wrong''

    Log error: anObject as: [:logEntry | ]


Comparing to original SystemLogger versions I separate user message from object content. It makes possible to log any object with extra user message. But anyway it not feels very well IMHO. And it requires three methods for each log level. Maybe we can put this methods into LogLevel itself:

    Log info add: anObject
    Log info add: anObject as: 'computation result'
    Log info add: anObject as: [:logEntry |

        logEntry message: 'something interesting to be saved with our
        object

        logEntry content: anotherObject]


    Log error add: anObject

    Log error add: anObject as: 'computation was wrong''

    Log error add: anObject as: [:logEntry | ]


And we can make short version for default logging level (which can be object specific):


    Log add: anObject

    Log add: anObject as: 'computation result'

    Log add: anObject as: [:logEntry | ]


That's all. I hope we can produce best suitable API for object logging. Then we can think how to adopt SystemLogger or Beacon for it. Also think about this API in context that we can register specific loggers for specific objects and specific importance level.

Best regards,
Denis

Reply via email to