4 Commits

Author SHA1 Message Date
ge
f688b3cad5 cleanup, use struct update syntax 2026-01-11 08:57:56 +03:00
ge
8b13a596f7 LogConfig: deprecate timestamp_*, add Timestamp 2026-01-11 06:04:13 +03:00
ge
98738e773d doc: pass v vet in CI 2026-01-03 16:44:31 +03:00
ge
791b376ff3 ci: Add CI 2026-01-03 16:41:00 +03:00
5 changed files with 121 additions and 15 deletions

48
.github/workflows/docs.yaml vendored Normal file
View File

@@ -0,0 +1,48 @@
name: Docs
on:
push:
branches: [ "master" ]
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup V
run: |
wget -qO /tmp/v.zip https://github.com/vlang/v/releases/latest/download/v_linux.zip
unzip -q /tmp/v.zip -d /tmp
echo /tmp/v >> "$GITHUB_PATH"
- name: Build docs
run: |
v doc -f html -m .
pushd _docs
ln -vs ${{ github.event.repository.name }}.html index.html
ls -alFh
popd
- name: Upload static files as artifact
id: deployment
uses: actions/upload-pages-artifact@v3
with:
path: _docs/
deploy:
needs: build
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
permissions:
contents: read
pages: write
id-token: write

27
.github/workflows/test.yaml vendored Normal file
View File

@@ -0,0 +1,27 @@
name: Lint and test
on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]
workflow_dispatch:
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup V
run: |
wget -qO /tmp/v.zip https://github.com/vlang/v/releases/latest/download/v_linux.zip
unzip -q /tmp/v.zip -d /tmp
echo /tmp/v >> "$GITHUB_PATH"
- name: Run tests
run: |
v fmt -verify .
v vet -v -W -I -F -r .
v missdoc -r --verify .
v -stats test .

View File

@@ -4,8 +4,10 @@ import structlog
fn main() { fn main() {
// Initialize logger with edited timestamp. // Initialize logger with edited timestamp.
log := structlog.new( log := structlog.new(
timestamp_format: .unix timestamp: structlog.Timestamp{
handler: structlog.JSONHandler{ format: .unix
}
handler: structlog.JSONHandler{
writer: os.stdout() writer: os.stdout()
} }
) )

View File

@@ -96,9 +96,8 @@ pub fn (r Record) append(field ...Field) Record {
mut fields_orig := unsafe { r.fields } mut fields_orig := unsafe { r.fields }
fields_orig << field fields_orig << field
return Record{ return Record{
channel: r.channel ...r
level: r.level fields: &fields_orig
fields: &fields_orig
} }
} }
@@ -110,9 +109,8 @@ pub fn (r Record) prepend(field ...Field) Record {
mut new_fields := unsafe { field } mut new_fields := unsafe { field }
new_fields << r.fields new_fields << r.fields
return Record{ return Record{
channel: r.channel ...r
level: r.level fields: new_fields
fields: new_fields
} }
} }
@@ -121,7 +119,7 @@ pub fn (r Record) field(name string, value Value) Record {
return r.append(Field{ name: name, value: value }) return r.append(Field{ name: name, value: value })
} }
// field adds new message field to a record and returns the modified record. // message adds new message field to a record and returns the modified record.
// This is a shothand for `field('message', 'message text')`. // This is a shothand for `field('message', 'message text')`.
pub fn (r Record) message(s string) Record { pub fn (r Record) message(s string) Record {
return r.field('message', s) return r.field('message', s)
@@ -144,6 +142,25 @@ pub fn (r Record) send() {
r.channel <- r r.channel <- r
} }
pub struct Timestamp {
pub mut:
// format sets the format of datettime for logs.
// TimestampFormat values map 1-to-1 to the date formats provided by `time.Time`.
// If .custom format is selected the timestamp_custom field must be set.
format TimestampFormat = .rfc3339
// custom sets the custom datetime string format if format is set to .custom.
// See docs for Time.format_custom() fn from stadnard `time` module.
custom string
// If local is true the local time will be used instead of UTC.
local bool
}
fn (t Timestamp) as_value() Value {
return timestamp(t.format, t.custom, t.local)
}
pub enum TimestampFormat { pub enum TimestampFormat {
default default
rfc3339 rfc3339
@@ -167,20 +184,23 @@ pub:
// This value cannot be changed after logger initialization. // This value cannot be changed after logger initialization.
level Level = .info level Level = .info
// timestamp holds the timestamp settings.
timestamp Timestamp
add_level bool = true // if true add `level` field to all log records. add_level bool = true // if true add `level` field to all log records.
add_timestamp bool = true // if true add `timestamp` field to all log records. add_timestamp bool = true // if true add `timestamp` field to all log records.
// timestamp_format sets the format of datettime for logs. // timestamp_format sets the format of datettime for logs.
// TimestampFormat values map 1-to-1 to the date formats provided by `time.Time`. // TimestampFormat values map 1-to-1 to the date formats provided by `time.Time`.
// If .custom format is selected the timestamp_custom field must be set. // If .custom format is selected the timestamp_custom field must be set.
timestamp_format TimestampFormat = .rfc3339 timestamp_format TimestampFormat = .rfc3339 @[deprecated: 'use `timestamp` instead']
// timestamp_custom sets the custom datetime string format if timestapm_format is // timestamp_custom sets the custom datetime string format if timestapm_format is
// set to .custom. See docs for Time.format_custom() fn from stadnard `time` module. // set to .custom. See docs for Time.format_custom() fn from stadnard `time` module.
timestamp_custom string timestamp_custom string @[deprecated: 'use `timestamp` instead']
// If timestamp_local is true the local time will be used instead of UTC. // If timestamp_local is true the local time will be used instead of UTC.
timestamp_local bool timestamp_local bool @[deprecated: 'use `timestamp` instead']
// handler holds a log record handler object which is used to process logs. // handler holds a log record handler object which is used to process logs.
handler RecordHandler = TextHandler{ handler RecordHandler = TextHandler{
@@ -239,11 +259,20 @@ pub fn new(config LogConfig) StructuredLog {
mut extra_fields := []Field{} mut extra_fields := []Field{}
mut timestamp := logger.timestamp
mut timestamp_old := Timestamp{
format: logger.timestamp_format
custom: logger.timestamp_custom
local: logger.timestamp_local
}
if timestamp != timestamp_old {
timestamp = timestamp_old
}
if logger.add_timestamp { if logger.add_timestamp {
extra_fields << Field{ extra_fields << Field{
name: 'timestamp' name: 'timestamp'
value: timestamp(logger.timestamp_format, logger.timestamp_custom, value: timestamp.as_value()
logger.timestamp_local)
} }
} }

2
v.mod
View File

@@ -1,7 +1,7 @@
Module { Module {
name: 'structlog' name: 'structlog'
description: 'Structured logs' description: 'Structured logs'
version: '0.1.0' version: '0.2.0'
license: 'MIT' license: 'MIT'
dependencies: [] dependencies: []
} }