I've released Watchtower v2.0.0 with 2 new features based on what I needed in my own projects.
Prevents log files from getting too big:
import watchtower
var logger = newLogger()
logger.setRotation(10.MB, 5) # Rotate at 10MB, keep 5 backups
Add key-value data to log messages:
var logger = newLogger()
logger.addContext("user_id", 12345)
logger.info("User logged in")
# Output: [INFO] User logged in [user_id=12345]
Here's a working example you can test:
import watchtower
var logger = newLogger()
logger.setRotation(1000, 3) # Small size to see rotation
logger.setOutputMode(OutputMode.console_file)
# Set application context
logger.addContext("service", "user_api")
logger.addContext("version", "2.1.0")
proc handleUserRequest(userId: int, endpoint: string) =
# Add request context
logger.addContext("user_id", userId)
logger.addContext("endpoint", endpoint)
logger.info("Request started")
try:
# Simulate some work
if userId == 999:
raise newException(ValueError, "Invalid user ID")
logger.info("Request completed successfully")
except:
logger.addContext("error", getCurrentExceptionMsg())
logger.error("Request failed")
# Test it
logger.info("Server starting up")
handleUserRequest(123, "/profile")
handleUserRequest(456, "/settings")
handleUserRequest(999, "/admin") # This will fail
logger.info("Server shutting down")
Output:
[2025-06-17 16:37:14] [INFO] Server starting up [version=2.1.0 service=user_api]
[2025-06-17 16:37:14] [INFO] Request started [endpoint=/profile user_id=123 version=2.1.0 service=user_api]
[2025-06-17 16:37:14] [INFO] Request completed successfully [endpoint=/profile user_id=123 version=2.1.0 service=user_api]
[2025-06-17 16:37:14] [ERROR] Request failed [endpoint=/admin user_id=999 version=2.1.0 error=Invalid user ID service=user_api]
Looking for feedback on what to add next. Some ideas:
Let me know what would be useful for your projects.
nimble install https://github.com/BeigeHornet151/watchtower
Still lightweight and zero dependencies. All v1.0.0 code works unchanged.
Is there any way to make the syntax like Chronicles, e.g.:
info "testing..",
a = a,
b = b