diff --git a/Makefile b/Makefile index 727ddbc6..77b9395e 100644 --- a/Makefile +++ b/Makefile @@ -5,9 +5,9 @@ DOCKER_PASSWORD= DOCKER_REGISTRY=thecodingmachine GOTENBERG_USER_GID=1001 GOTENBERG_USER_UID=1001 -GOLANGCI_LINT_VERSION=1.20.1 +GOLANGCI_LINT_VERSION=1.25.1 CODE_COVERAGE=0 -TINI_VERSION=0.18.0 +TINI_VERSION=0.19.0 MAXIMUM_WAIT_TIMEOUT=30.0 MAXIMUM_WAIT_DELAY=10.0 MAXIMUM_WEBHOOK_URL_TIMEOUT=30.0 @@ -36,7 +36,6 @@ fmt: # run all linters. lint: - make workspace docker build --build-arg GOLANGCI_LINT_VERSION=$(GOLANGCI_LINT_VERSION) -t $(DOCKER_REGISTRY)/gotenberg:lint -f build/lint/Dockerfile . docker run --rm $(DOCKER_REGISTRY)/gotenberg:lint diff --git a/build/lint/Dockerfile b/build/lint/Dockerfile index 42a8c054..4b24276d 100644 --- a/build/lint/Dockerfile +++ b/build/lint/Dockerfile @@ -1,17 +1,6 @@ -FROM thecodingmachine/gotenberg:workspace - -# |-------------------------------------------------------------------------- -# | GolangCI-Lint -# |-------------------------------------------------------------------------- -# | -# | Installs GolangCI-Lint, a linters Runner for Go. 5x faster -# | than gometalinter. -# | - ARG GOLANGCI_LINT_VERSION -RUN curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh -s -- -b /usr/local/bin v${GOLANGCI_LINT_VERSION} &&\ - golangci-lint --version +FROM golangci/golangci-lint:v$GOLANGCI_LINT_VERSION # |-------------------------------------------------------------------------- # | Final touch @@ -21,16 +10,13 @@ RUN curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.s # | # Define our working directory outside of $GOPATH (we're using go modules). -USER gotenberg WORKDIR /gotenberg/lint -# Install module dependencies. -COPY --chown=gotenberg:gotenberg go.mod go.sum ./ +# Copy our code source. +COPY . . +# Install module dependencies. RUN go mod download &&\ go mod verify -# Copy our code source. -COPY --chown=gotenberg:gotenberg . . - -CMD ["golangci-lint", "run" ,"--tests=false", "--enable-all", "--disable=dupl", "--disable=funlen", "--disable=wsl", "--disable=gocognit" ] \ No newline at end of file +CMD ["golangci-lint", "run" ,"--tests=false", "--enable-all", "--disable=dupl", "--disable=funlen", "--disable=wsl", "--disable=gocognit", "--disable=gomnd" ] \ No newline at end of file diff --git a/cmd/gotenberg/main.go b/cmd/gotenberg/main.go index 78df8917..4759d7d6 100644 --- a/cmd/gotenberg/main.go +++ b/cmd/gotenberg/main.go @@ -24,8 +24,8 @@ func main() { if err != nil { systemLogger.FatalOp(op, err) } - systemLogger.InfofOp(op, "Gotenberg %s", version) - systemLogger.DebugfOp(op, "configuration: %+v", config) + systemLogger.InfoOpf(op, "Gotenberg %s", version) + systemLogger.DebugOpf(op, "configuration: %+v", config) if !config.DisableGoogleChrome() { // start Google Chrome headless. if err := chrome.Start(systemLogger); err != nil { @@ -36,7 +36,7 @@ func main() { srv := xhttp.New(config) // run our API in a goroutine so that it doesn't block. go func() { - systemLogger.InfofOp(op, "http server started on port '%d'", config.DefaultListenPort()) + systemLogger.InfoOpf(op, "http server started on port '%d'", config.DefaultListenPort()) if err := srv.Start(fmt.Sprintf(":%d", config.DefaultListenPort())); err != nil { if err != http.ErrServerClosed { systemLogger.FatalOp(op, err) diff --git a/go.mod b/go.mod index 3b926118..2199c0a1 100644 --- a/go.mod +++ b/go.mod @@ -1,30 +1,27 @@ module github.com/thecodingmachine/gotenberg -go 1.13 +go 1.14 require ( github.com/dustin/go-humanize v1.0.0 - github.com/google/go-cmp v0.3.1 // indirect - github.com/gorilla/websocket v1.4.1 // indirect - github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect - github.com/kr/pretty v0.1.0 // indirect - github.com/labstack/echo/v4 v4.1.11 + github.com/konsorten/go-windows-terminal-sequences v1.0.3 // indirect + github.com/kr/text v0.2.0 // indirect + github.com/labstack/echo/v4 v4.1.16 github.com/labstack/gommon v0.3.0 - github.com/mafredri/cdp v0.25.0 - github.com/mattn/go-colorable v0.1.4 // indirect - github.com/mattn/go-isatty v0.0.11 + github.com/mafredri/cdp v0.28.0 + github.com/mattn/go-isatty v0.0.12 github.com/microcosm-cc/bluemonday v1.0.2 + github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2 github.com/russross/blackfriday/v2 v2.0.1 github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect - github.com/sirupsen/logrus v1.4.2 + github.com/sirupsen/logrus v1.5.0 github.com/stretchr/testify v1.5.1 - github.com/valyala/fasttemplate v1.1.0 // indirect - golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413 // indirect - golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 // indirect - golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e - golang.org/x/sys v0.0.0-20191210023423-ac6580df4449 // indirect + golang.org/x/crypto v0.0.0-20200429183012-4b2356b1ed79 // indirect + golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5 // indirect + golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a + golang.org/x/sys v0.0.0-20200501052902-10377860bb8e // indirect golang.org/x/text v0.3.2 - gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect - gopkg.in/yaml.v2 v2.2.7 // indirect + gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect + gopkg.in/yaml.v2 v2.2.8 // indirect ) diff --git a/go.sum b/go.sum index c17f8727..fbdf8826 100644 --- a/go.sum +++ b/go.sum @@ -1,41 +1,40 @@ +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= +github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/labstack/echo/v4 v4.1.11 h1:z0BZoArY4FqdpUEl+wlHp4hnr/oSR6MTmQmv8OHSoww= -github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/labstack/echo/v4 v4.1.16 h1:8swiwjE5Jkai3RPfZoahp8kjVCRNq+y7Q0hPji2Kz0o= +github.com/labstack/echo/v4 v4.1.16/go.mod h1:awO+5TzAjvL8XpibdsfXxPgHr+orhtXZJZIQCVjogKI= github.com/labstack/gommon v0.3.0 h1:JEeO0bvc78PKdyHxloTKiF8BD5iGrH8T6MSeGvSgob0= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= -github.com/mafredri/cdp v0.25.0 h1:nXhdpjP8Nrhw+9jnMlljEF6xs2B3vXI/wSiKDOvOXGs= -github.com/mafredri/cdp v0.25.0/go.mod h1:hgdiA0yp1uqhSaDOHJWPgXpMbh+LAfUdD9vbN2AM8gE= -github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU= +github.com/mafredri/cdp v0.28.0 h1:v/LWC3GpactA1EaS737bl+eNUhvOaDh+FzvyoDxNM5o= +github.com/mafredri/cdp v0.28.0/go.mod h1:11586MgpyJuQR4qiXQ/7HBame2FtGIBzymaUHZcQ0PY= +github.com/mafredri/go-lint v0.0.0-20180911205320-920981dfc79e/go.mod h1:k/zdyxI3q6dup24o8xpYjJKTCf2F7rfxLp6w/efTiWs= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE= +github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9 h1:d5US/mDsogSGW37IV293h//ZFaeajb69h+EHFsv2xGg= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= -github.com/mattn/go-isatty v0.0.11 h1:FxPOTFNqGkuDUGi3H/qkUbQO4ZiBa2brKq5r0l8TGeM= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/microcosm-cc/bluemonday v1.0.2 h1:5lPfLTTAvAbtS0VqT+94yOtFnGfUWYyx0+iToC3Os3s= github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2 h1:JhzVVoYvbOACxoUmOs6V/G4D5nPVUW73rKvXxP4XUJc= github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -44,50 +43,58 @@ github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0 github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.5.0 h1:1N5EYkVAPEywqZRJd7cwnRtCb6xJx7NH3T3WUTF980Q= +github.com/sirupsen/logrus v1.5.0/go.mod h1:+F7Ogzej0PZc/94MaYx/nvG9jOFMD2osvC3s+Squfpo= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasttemplate v1.0.1 h1:tY9CJiPnMXf1ERmG2EyK7gNUd+c6RKGD0IfU8WdUSz8= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.1.0 h1:RZqt0yGBsps8NGvLSGW804QQqCUYYLsaOjTVHy1Ocw4= github.com/valyala/fasttemplate v1.1.0/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 h1:HuIa8hRrWRSrqYzx1qI49NNxhdi2PrY7gxVSq1JjLDc= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413 h1:ULYEB3JvPRE/IfO+9uO7vKV/xzVTO7XPAwm8xbf4w2g= -golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200429183012-4b2356b1ed79 h1:IaQbIIB2X/Mp/DKctl6ROxz1KyMlKp4uyvL6+kQ7C88= +golang.org/x/crypto v0.0.0-20200429183012-4b2356b1ed79/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 h1:efeOvDhwQ29Dj3SdAV/MJf8oukgn+8D8WgaCaRMchF8= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5 h1:WQ8q63x+f/zpC8Ac1s9wLElVoHhm32p6tudrU72n1QA= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a h1:WXEvlFVvvGxCJLG6REjsT03iWnKLEWinaScsxF2Vm2o= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a h1:aYOabOQFp6Vj6W1F80affTUvO9UxmJRx8K0gsfABByQ= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191210023423-ac6580df4449 h1:gSbV7h1NRL2G1xTg/owz62CST1oJBmxy4QpMMregXVQ= -golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e h1:hq86ru83GdWTlfQFZGO4nZJTU4Bs2wfHl8oFHRaXsfc= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200330183114-f8bfb4ee3038/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.7 h1:VUgggvou5XRW9mHwD/yXxIYSMtY0zoKQf/v226p2nyo= -gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/internal/app/xhttp/handler.go b/internal/app/xhttp/handler.go index 92cf22ea..ea442685 100644 --- a/internal/app/xhttp/handler.go +++ b/internal/app/xhttp/handler.go @@ -239,13 +239,13 @@ func convert(ctx context.Context, p printer.Printer) error { // and directly return the resulting PDF file // or an error. if !r.HasArg(resource.WebhookURLArgKey) { - logger.DebugfOp(op, "no '%s' found, converting synchronously", resource.WebhookURLArgKey) + logger.DebugOpf(op, "no '%s' found, converting synchronously", resource.WebhookURLArgKey) return convertSync(ctx, p, filename, fpath) } // as a webhook URL has been given, we // run the following lines in a goroutine so that // it doesn't block. - logger.DebugfOp(op, "'%s' found, converting asynchronously", resource.WebhookURLArgKey) + logger.DebugOpf(op, "'%s' found, converting asynchronously", resource.WebhookURLArgKey) return convertAsync(ctx, p, filename, fpath) } if err := resolver(); err != nil { @@ -264,7 +264,7 @@ func convertSync(ctx context.Context, p printer.Printer, filename, fpath string) return err } if !r.HasArg(resource.ResultFilenameArgKey) { - logger.DebugfOp( + logger.DebugOpf( op, "no '%s' found, using generated filename '%s'", resource.RemoteURLArgKey, @@ -275,7 +275,7 @@ func convertSync(ctx context.Context, p printer.Printer, filename, fpath string) } return nil } - logger.DebugfOp( + logger.DebugOpf( op, "'%s' found, so not using generated filename", resource.ResultFilenameArgKey, @@ -321,7 +321,7 @@ func convertAsync(ctx context.Context, p printer.Printer, filename, fpath string return } defer f.Close() // nolint: errcheck - logger.DebugfOp( + logger.DebugOpf( op, "preparing to send result file '%s' to '%s'...", filename, @@ -342,13 +342,13 @@ func convertAsync(ctx context.Context, p printer.Printer, filename, fpath string if len(customHTTPHeaders) > 0 { for key, value := range customHTTPHeaders { req.Header.Set(key, value) - logger.DebugfOp(op, "set '%s' to custom HTTP header '%s'", value, key) + logger.DebugOpf(op, "set '%s' to custom HTTP header '%s'", value, key) } } else { logger.DebugOp(op, "skipping custom HTTP headers as none have been provided...") } // send the result file. - logger.DebugfOp( + logger.DebugOpf( op, "sending result file '%s' to '%s'...", filename, @@ -361,7 +361,7 @@ func convertAsync(ctx context.Context, p printer.Printer, filename, fpath string return } defer resp.Body.Close() // nolint: errcheck - logger.DebugfOp( + logger.DebugOpf( op, "result file '%s' sent to '%s'", filename, diff --git a/internal/app/xhttp/pkg/context/context.go b/internal/app/xhttp/pkg/context/context.go index b8e0b892..9e5fd11c 100644 --- a/internal/app/xhttp/pkg/context/context.go +++ b/internal/app/xhttp/pkg/context/context.go @@ -167,14 +167,14 @@ func (ctx Context) LogRequestResult(err error, isDebug bool) error { "bytes_out": bytesOut(resp), } if err != nil { - ctx.logger.WithFields(fields).ErrorfOp(op, "request failed") + ctx.logger.WithFields(fields).ErrorOpf(op, "request failed") return err } if isDebug { - ctx.logger.WithFields(fields).DebugfOp(op, "request handled") + ctx.logger.WithFields(fields).DebugOpf(op, "request handled") return nil } - ctx.logger.WithFields(fields).InfofOp(op, "request handled") + ctx.logger.WithFields(fields).InfoOpf(op, "request handled") return nil } diff --git a/internal/app/xhttp/pkg/resource/file.go b/internal/app/xhttp/pkg/resource/file.go index 45f18fd1..6777d482 100644 --- a/internal/app/xhttp/pkg/resource/file.go +++ b/internal/app/xhttp/pkg/resource/file.go @@ -25,7 +25,7 @@ func (f file) write(in io.Reader) error { return err } defer out.Close() // nolint: errcheck - if err := out.Chmod(0644); err != nil { + if err := out.Chmod(0600); err != nil { return err } if _, err := io.Copy(out, in); err != nil { diff --git a/internal/app/xhttp/pkg/resource/resource.go b/internal/app/xhttp/pkg/resource/resource.go index 3a983f18..44b64599 100644 --- a/internal/app/xhttp/pkg/resource/resource.go +++ b/internal/app/xhttp/pkg/resource/resource.go @@ -50,7 +50,7 @@ func New(logger xlog.Logger, directoryName string) (Resource, error) { if err != nil { return Resource{}, xerror.New(op, err) } - logger.DebugfOp(op, "resource directory '%s' created", directoryName) + logger.DebugOpf(op, "resource directory '%s' created", directoryName) return Resource{ logger: logger, dirPath: dirPath, @@ -65,13 +65,13 @@ func New(logger xlog.Logger, directoryName string) (Resource, error) { func (r Resource) Close() error { const op string = "resource.Resource.Close" if _, err := os.Stat(r.dirPath); os.IsNotExist(err) { - r.logger.DebugfOp(op, "resource directory '%s' does not exist, nothing to remove", r.dirPath) + r.logger.DebugOpf(op, "resource directory '%s' does not exist, nothing to remove", r.dirPath) return nil } if err := os.RemoveAll(r.dirPath); err != nil { return xerror.New(op, err) } - r.logger.DebugfOp(op, "resource directory '%s' removed", r.dirPath) + r.logger.DebugOpf(op, "resource directory '%s' removed", r.dirPath) return nil } @@ -84,17 +84,17 @@ func (r *Resource) WithCustomHTTPHeader(key string, value string) { if strings.Contains(canonicalKey, RemoteURLCustomHTTPHeaderCanonicalBaseKey) || strings.Contains(canonicalKey, WebhookURLCustomHTTPHeaderCanonicalBaseKey) { r.customHeaders[canonicalKey] = value - r.logger.DebugfOp(op, "added '%s' with value '%s' to resource custom HTTP headers", canonicalKey, value) + r.logger.DebugOpf(op, "added '%s' with value '%s' to resource custom HTTP headers", canonicalKey, value) return } - r.logger.DebugfOp(op, "skipping '%s' as it is not a custom HTTP header...", canonicalKey) + r.logger.DebugOpf(op, "skipping '%s' as it is not a custom HTTP header...", canonicalKey) } // WithArg add a new argument to the Resource. func (r *Resource) WithArg(key ArgKey, value string) { const op string = "resource.Resource.WithArg" r.args[key] = value - r.logger.DebugfOp(op, "added '%s' with value '%s' to resource args", key, value) + r.logger.DebugOpf(op, "added '%s' with value '%s' to resource args", key, value) } // WithFile add a new file to the Resource. @@ -112,7 +112,7 @@ func (r *Resource) WithFile(filename string, in io.Reader) error { return err } r.files[filename] = file - r.logger.DebugfOp(op, "resource file '%s' created", filename) + r.logger.DebugOpf(op, "resource file '%s' created", filename) return nil } if err := resolver(); err != nil { diff --git a/internal/pkg/chrome/chrome.go b/internal/pkg/chrome/chrome.go index 9bd2ecc9..a2250cfc 100644 --- a/internal/pkg/chrome/chrome.go +++ b/internal/pkg/chrome/chrome.go @@ -132,21 +132,21 @@ func isViable(logger xlog.Logger) bool { ctx, cancel := context.WithCancel(context.Background()) defer cancel() endpoint := "http://localhost:9222" - logger.DebugfOp( + logger.DebugOpf( op, "checking Google Chrome headless process viability via endpoint '%s/json/version'", endpoint, ) v, err := devtool.New(endpoint).Version(ctx) if err != nil { - logger.DebugfOp( + logger.DebugOpf( op, "Google Chrome headless is not viable as endpoint returned '%v'", err.Error(), ) return false } - logger.DebugfOp( + logger.DebugOpf( op, "Google Chrome headless is viable as endpoint returned '%v'", v, @@ -162,9 +162,12 @@ func isViable(logger xlog.Logger) bool { } func warmup(logger xlog.Logger) { - const op string = "chrome.warmup" - warmupTime := xtime.Duration(0.5) - logger.DebugfOp( + const ( + op string = "chrome.warmup" + seconds float64 = 0.5 + ) + warmupTime := xtime.Duration(seconds) + logger.DebugOpf( op, "waiting '%v' for allowing Google Chrome to warmup", warmupTime, diff --git a/internal/pkg/printer/chrome.go b/internal/pkg/printer/chrome.go index 745e3232..718d6f7b 100644 --- a/internal/pkg/printer/chrome.go +++ b/internal/pkg/printer/chrome.go @@ -97,7 +97,8 @@ func (p chromePrinter) Print(destination string) error { defer devtConn.Close() // nolint: errcheck // create a new CDP Client that uses conn. devtClient := cdp.NewClient(devtConn) - newContextTarget, err := devtClient.Target.CreateBrowserContext(ctx) + createBrowserContextArgs := target.NewCreateBrowserContextArgs() + newContextTarget, err := devtClient.Target.CreateBrowserContext(ctx, createBrowserContextArgs) if err != nil { return err } @@ -162,7 +163,7 @@ func (p chromePrinter) Print(destination string) error { // apply a wait delay (if any). if p.opts.WaitDelay > 0.0 { // wait for a given amount of time (useful for javascript delay). - p.logger.DebugfOp(op, "applying a wait delay of '%.2fs'...", p.opts.WaitDelay) + p.logger.DebugOpf(op, "applying a wait delay of '%.2fs'...", p.opts.WaitDelay) time.Sleep(xtime.Duration(p.opts.WaitDelay)) } else { p.logger.DebugOp(op, "no wait delay to apply, moving on...") @@ -183,8 +184,8 @@ func (p chromePrinter) Print(destination string) error { if p.opts.PageRanges != "" { printToPdfArgs.SetPageRanges(p.opts.PageRanges) } - // print the page to PDF. - print, err := targetClient.Page.PrintToPDF( + // printToPDF the page to PDF. + printToPDF, err := targetClient.Page.PrintToPDF( ctx, printToPdfArgs, ) @@ -209,7 +210,7 @@ func (p chromePrinter) Print(destination string) error { } return err } - if err := ioutil.WriteFile(destination, print.Data, 0644); err != nil { + if err := ioutil.WriteFile(destination, printToPDF.Data, 0600); err != nil { return err } return nil @@ -282,7 +283,7 @@ func (p chromePrinter) setCustomHTTPHeaders(ctx context.Context, client *cdp.Cli // useless but for the logs. for key, value := range p.opts.CustomHTTPHeaders { customHTTPHeaders[key] = value - p.logger.DebugfOp(op, "set '%s' to custom HTTP header '%s'", value, key) + p.logger.DebugOpf(op, "set '%s' to custom HTTP header '%s'", value, key) } b, err := json.Marshal(customHTTPHeaders) if err != nil { @@ -357,7 +358,7 @@ func (p chromePrinter) listenEvents(ctx context.Context, client *cdp.Client) err if err != nil { return err } - p.logger.DebugfOp(op, "event '%s' received", ev.Name) + p.logger.DebugOpf(op, "event '%s' received", ev.Name) if ev.Name == networkIdleEventName { break } diff --git a/internal/pkg/printer/markdown.go b/internal/pkg/printer/markdown.go index 3ac9956c..97f5d797 100644 --- a/internal/pkg/printer/markdown.go +++ b/internal/pkg/printer/markdown.go @@ -36,7 +36,7 @@ func NewMarkdownPrinter(logger xlog.Logger, fpath string, opts ChromePrinterOpti baseFilename := xrand.Get() dst := fmt.Sprintf("%s/%s.html", dirPath, baseFilename) logger.DebugOp(op, "writing the HTML from previous conversion(s) into new file...") - if err := ioutil.WriteFile(dst, buffer.Bytes(), 0644); err != nil { + if err := ioutil.WriteFile(dst, buffer.Bytes(), 0600); err != nil { return "", err } return fmt.Sprintf("file://%s", dst), nil diff --git a/internal/pkg/printer/merge.go b/internal/pkg/printer/merge.go index bc663b3d..6fab9a83 100644 --- a/internal/pkg/printer/merge.go +++ b/internal/pkg/printer/merge.go @@ -57,7 +57,7 @@ func (p mergePrinter) Print(destination string) error { } // see https://github.com/thecodingmachine/gotenberg/issues/139. sort.Strings(p.fpaths) - p.logger.DebugfOp(op, "merging '%v'...", p.fpaths) + p.logger.DebugOpf(op, "merging '%v'...", p.fpaths) resolver := func() error { var args []string args = append(args, p.fpaths...) diff --git a/internal/pkg/printer/office.go b/internal/pkg/printer/office.go index 020e5688..c95862ea 100644 --- a/internal/pkg/printer/office.go +++ b/internal/pkg/printer/office.go @@ -64,11 +64,11 @@ func (p officePrinter) Print(destination string) error { for i, fpath := range p.fpaths { baseFilename := xrand.Get() tmpDest := fmt.Sprintf("%s/%d%s.pdf", dirPath, i, baseFilename) - p.logger.DebugfOp(op, "converting '%s' to PDF...", fpath) + p.logger.DebugOpf(op, "converting '%s' to PDF...", fpath) if err := p.unoconv(ctx, fpath, tmpDest); err != nil { return err } - p.logger.DebugfOp(op, "'%s.pdf' created", baseFilename) + p.logger.DebugOpf(op, "'%s.pdf' created", baseFilename) fpaths[i] = tmpDest } if len(fpaths) == 1 { diff --git a/internal/pkg/printer/printer.go b/internal/pkg/printer/printer.go index de800bdf..97c05a93 100644 --- a/internal/pkg/printer/printer.go +++ b/internal/pkg/printer/printer.go @@ -12,5 +12,5 @@ type Printer interface { func logOptions(logger xlog.Logger, opts interface{}) { const op string = "printer.logOptions" - logger.DebugfOp(op, "options: %+v", opts) + logger.DebugOpf(op, "options: %+v", opts) } diff --git a/internal/pkg/xcontext/xcontext.go b/internal/pkg/xcontext/xcontext.go index 67a27d16..2c4259e4 100644 --- a/internal/pkg/xcontext/xcontext.go +++ b/internal/pkg/xcontext/xcontext.go @@ -14,7 +14,7 @@ import ( // times out after given seconds. func WithTimeout(logger xlog.Logger, seconds float64) (context.Context, context.CancelFunc) { const op string = "xcontext.WithTimeout" - logger.DebugfOp(op, "creating context with '%.2fs' of timeout...", seconds) + logger.DebugOpf(op, "creating context with '%.2fs' of timeout...", seconds) return context.WithTimeout(context.Background(), xtime.Duration(seconds)) } diff --git a/internal/pkg/xexec/xexec.go b/internal/pkg/xexec/xexec.go index 127f65c6..6ff7c28d 100644 --- a/internal/pkg/xexec/xexec.go +++ b/internal/pkg/xexec/xexec.go @@ -84,11 +84,11 @@ func Run(ctx context.Context, logger xlog.Logger, binary string, args ...string) }() select { case err := <-result: - logger.DebugfOp(op, "command '%s' finished", strings.Join(cmd.Args, " ")) + logger.DebugOpf(op, "command '%s' finished", strings.Join(cmd.Args, " ")) kill() return err case <-ctx.Done(): - logger.DebugfOp(op, "command '%s' failed to finish before context.Context deadline", strings.Join(cmd.Args, " ")) + logger.DebugOpf(op, "command '%s' failed to finish before context.Context deadline", strings.Join(cmd.Args, " ")) kill() return ctx.Err() } @@ -102,7 +102,7 @@ func Run(ctx context.Context, logger xlog.Logger, binary string, args ...string) // LogBeforeExecute logs a command before its execution. func LogBeforeExecute(logger xlog.Logger, cmd *exec.Cmd) { const op string = "xexec.LogBeforeExecute" - logger.DebugfOp(op, "executing command: %s", strings.Join(cmd.Args, " ")) + logger.DebugOpf(op, "executing command: %s", strings.Join(cmd.Args, " ")) } func pipe(logger xlog.Logger, cmd *exec.Cmd) error { diff --git a/internal/pkg/xlog/xlog.go b/internal/pkg/xlog/xlog.go index b8aa271a..af571d91 100644 --- a/internal/pkg/xlog/xlog.go +++ b/internal/pkg/xlog/xlog.go @@ -104,9 +104,9 @@ func (l Logger) DebugOp(op, message string) { l.entry.WithField("op", op).Debug(message) } -// DebugfOp logs a debug message for given +// DebugOpf logs a debug message for given // logical operation and format. -func (l Logger) DebugfOp(op, format string, args ...interface{}) { +func (l Logger) DebugOpf(op, format string, args ...interface{}) { l.entry.WithField("op", op).Debugf(format, args...) } @@ -116,9 +116,9 @@ func (l Logger) InfoOp(op, message string) { l.entry.WithField("op", op).Info(message) } -// InfofOp logs an info message for given +// InfoOpf logs an info message for given // logical operation and format. -func (l Logger) InfofOp(op, format string, args ...interface{}) { +func (l Logger) InfoOpf(op, format string, args ...interface{}) { l.entry.WithField("op", op).Infof(format, args...) } @@ -128,9 +128,9 @@ func (l Logger) ErrorOp(op string, err error) { l.entry.WithField("op", op).Error(err.Error()) } -// ErrorfOp logs an error message for given +// ErrorOpf logs an error message for given // logical operation and format. -func (l Logger) ErrorfOp(op, format string, args ...interface{}) { +func (l Logger) ErrorOpf(op, format string, args ...interface{}) { l.entry.WithField("op", op).Errorf(format, args...) }