Changeset 215 in code for trunk


Ignore:
Timestamp:
Apr 3, 2020, 4:59:17 PM (5 years ago)
Author:
contact
Message:

Introduce messageLogger

This centralizes formatting related to message logging in a single
place.

Location:
trunk
Files:
1 added
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/downstream.go

    r213 r215  
    12331233                        dc.lock.Unlock()
    12341234
    1235                         uc.appendLog(upstreamName, "<%s> %s", uc.nick, text)
     1235                        uc.appendLog(upstreamName, echoMsg)
    12361236
    12371237                        uc.network.ring.Produce(echoMsg)
  • trunk/upstream.go

    r212 r215  
    99        "net"
    1010        "os"
    11         "path/filepath"
    1211        "strconv"
    1312        "strings"
     
    6362        pendingLISTDownstreamSet map[uint64]struct{}
    6463
    65         logs map[string]entityLog
     64        messageLoggers map[string]*messageLogger
    6665}
    6766
     
    9897                availableMemberships:     stdMemberships,
    9998                pendingLISTDownstreamSet: make(map[uint64]struct{}),
    100                 logs:                     make(map[string]entityLog),
     99                messageLoggers:           make(map[string]*messageLogger),
    101100        }
    102101
     
    274273                                target = msg.Prefix.Name
    275274                        }
    276                         uc.appendLog(target, "<%s> %s", msg.Prefix.Name, text)
     275                        uc.appendLog(target, msg)
    277276
    278277                        uc.forEachDownstream(func(dc *downstreamConn) {
     
    579578                                delete(ch.Members, msg.Prefix.Name)
    580579                                ch.Members[newNick] = membership
    581                                 uc.appendLog(ch.Name, "*** %s is now known as %s", msg.Prefix.Name, newNick)
     580                                uc.appendLog(ch.Name, msg)
    582581                        }
    583582                }
     
    623622                        }
    624623
    625                         uc.appendLog(ch, "*** Joins: %s (%s@%s)", msg.Prefix.Name, msg.Prefix.User, msg.Prefix.Host)
     624                        uc.appendLog(ch, msg)
    626625
    627626                        uc.forEachDownstream(func(dc *downstreamConn) {
     
    660659                        }
    661660
    662                         uc.appendLog(ch, "*** Parts: %s (%s@%s) (%s)", msg.Prefix.Name, msg.Prefix.User, msg.Prefix.Host, reason)
     661                        uc.appendLog(ch, msg)
    663662
    664663                        uc.forEachDownstream(func(dc *downstreamConn) {
     664                                params := []string{dc.marshalChannel(uc, ch)}
     665                                if reason != "" {
     666                                        params = append(params, reason)
     667                                }
    665668                                dc.SendMessage(&irc.Message{
    666669                                        Prefix:  dc.marshalUserPrefix(uc, msg.Prefix),
    667670                                        Command: "PART",
    668                                         Params:  []string{dc.marshalChannel(uc, ch)},
     671                                        Params:  params,
    669672                                })
    670673                        })
     
    682685                var reason string
    683686                if len(msg.Params) > 2 {
    684                         reason = msg.Params[1]
     687                        reason = msg.Params[2]
    685688                }
    686689
     
    696699                }
    697700
    698                 uc.appendLog(channel, "*** %s was kicked by %s (%s)", user, msg.Prefix.Name, reason)
     701                uc.appendLog(channel, msg)
    699702
    700703                uc.forEachDownstream(func(dc *downstreamConn) {
     
    714717                }
    715718
    716                 var reason string
    717                 if len(msg.Params) > 0 {
    718                         reason = msg.Params[0]
    719                 }
    720 
    721719                if msg.Prefix.Name == uc.nick {
    722720                        uc.logger.Printf("quit")
     
    727725                                delete(ch.Members, msg.Prefix.Name)
    728726
    729                                 uc.appendLog(ch.Name, "*** Quits: %s (%s@%s) (%s)", msg.Prefix.Name, msg.Prefix.User, msg.Prefix.Host, reason)
     727                                uc.appendLog(ch.Name, msg)
    730728                        }
    731729                }
     
    803801                        }
    804802
    805                         modeMsg := modeStr
    806                         for _, v := range msg.Params[2:] {
    807                                 modeMsg += " " + v
    808                         }
    809                         uc.appendLog(ch.Name, "*** %s sets mode: %s", msg.Prefix.Name, modeMsg)
     803                        uc.appendLog(ch.Name, msg)
    810804
    811805                        uc.forEachDownstream(func(dc *downstreamConn) {
     
    11641158                        target = msg.Prefix.Name
    11651159                }
    1166                 uc.appendLog(target, "<%s> %s", msg.Prefix.Name, text)
     1160                uc.appendLog(target, msg)
    11671161
    11681162                uc.network.ring.Produce(msg)
     
    13781372
    13791373// TODO: handle moving logs when a network name changes, when support for this is added
    1380 func (uc *upstreamConn) appendLog(entity string, format string, a ...interface{}) {
     1374func (uc *upstreamConn) appendLog(entity string, msg *irc.Message) {
    13811375        if uc.srv.LogPath == "" {
    13821376                return
    13831377        }
    1384         // TODO: enforce maximum open file handles (LRU cache of file handles)
    1385         // TODO: handle non-monotonic clock behaviour
    1386         now := time.Now()
    1387         year, month, day := now.Date()
    1388         name := fmt.Sprintf("%04d-%02d-%02d.log", year, month, day)
    1389         log, ok := uc.logs[entity]
    1390         if !ok || log.name != name {
    1391                 if ok {
    1392                         log.file.Close()
    1393                         delete(uc.logs, entity)
    1394                 }
    1395                 // TODO: handle/forbid network/entity names with illegal path characters
    1396                 dir := filepath.Join(uc.srv.LogPath, uc.user.Username, uc.network.Name, entity)
    1397                 if err := os.MkdirAll(dir, 0700); err != nil {
    1398                         uc.logger.Printf("failed to log message: could not create logs directory %q: %v", dir, err)
    1399                         return
    1400                 }
    1401                 path := filepath.Join(dir, name)
    1402                 f, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0600)
    1403                 if err != nil {
    1404                         uc.logger.Printf("failed to log message: could not open or create log file %q: %v", path, err)
    1405                         return
    1406                 }
    1407                 log = entityLog{
    1408                         name: name,
    1409                         file: f,
    1410                 }
    1411                 uc.logs[entity] = log
    1412         }
    1413 
    1414         format = "[%02d:%02d:%02d] " + format + "\n"
    1415         args := []interface{}{now.Hour(), now.Minute(), now.Second()}
    1416         args = append(args, a...)
    1417 
    1418         if _, err := fmt.Fprintf(log.file, format, args...); err != nil {
    1419                 uc.logger.Printf("failed to log message to %q: %v", log.name, err)
     1378
     1379        ml, ok := uc.messageLoggers[entity]
     1380        if !ok {
     1381                ml = newMessageLogger(uc, entity)
     1382                uc.messageLoggers[entity] = ml
     1383        }
     1384
     1385        if err := ml.Append(msg); err != nil {
     1386                uc.logger.Printf("failed to log message: %v", err)
    14201387        }
    14211388}
  • trunk/user.go

    r204 r215  
    208208                        uc.network.lock.Unlock()
    209209
    210                         for _, log := range uc.logs {
    211                                 log.file.Close()
     210                        for _, ml := range uc.messageLoggers {
     211                                if err := ml.Close(); err != nil {
     212                                        uc.logger.Printf("failed to close message logger: %v", err)
     213                                }
    212214                        }
    213215
Note: See TracChangeset for help on using the changeset viewer.