如何将 lighttpd 访问日志发送到标准输出?

如何将 lighttpd 访问日志发送到标准输出?

我在 Ubuntu 上的 Docker 容器中运行lighttpd(作为我的设置中必须始终启动的服务traefik)。我的docker-compose.yml容器包含:

  lighttpd:
    image: sebp/lighttpd
    container_name: lighttpd
    restart: unless-stopped
    volumes:
      - /srv/docker/traefik/lighttpd/etc/lighttpd.conf:/etc/lighttpd/lighttpd.conf
      - /srv/docker/traefik/lighttpd/log/error.log:/var/log/lighttpd/error.log
      - /srv/docker/traefik/lighttpd/log/access.log:/var/log/lighttpd/access.log
      - /var/www/miniserver/html/:/var/www/html/
    ports:
      - "80"
    tty: true
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.lighttpd.rule=Host(`foo.rna.nl`)"
      - "traefik.http.routers.lighttpd.entrypoints=web"
      - "traefik.http.routers.lighttpd.tls=false"
    networks:
      - proxy

lighttpd可以工作,对我有用index.html,但是:

# docker logs lighttpd
2022-10-29 12:13:55: (server.c.1568) server started (lighttpd/1.4.64)

我收到了启动消息,但没有收到其他消息。当我将访问日志指向某个文件时,我收到了那里的访问日志条目:

172.26.0.2 foo.rna.nl - [29/Oct/2022:11:53:02 +0000] "GET /index.html HTTP/1.1" 200 37 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Safari/605.1.15"

如何将lighttpd的访问日志直接发送到 stdout?我尝试了以下两种方法:

accesslog.filename = "/proc/self/fd/1"
accesslog.filename = "/dev/stdout"

我的完整lighttpd.conf

server.modules = (
    "mod_indexfile",
    "mod_access",
    "mod_alias",
    "mod_redirect",
    "mod_accesslog",
)

server.document-root = "/var/www/html" 
#server.errorlog = "/var/log/lighttpd/error.log"
server.port = 80

mimetype.assign = (
  ".html" => "text/html", 
  ".txt" => "text/plain",
  ".jpg" => "image/jpeg",
  ".png" => "image/png" 
)

accesslog.filename = "/proc/self/fd/1"
#accesslog.filename = "/dev/stdout"
#accesslog.filename = "/var/log/lighttpd/access.log"

答案1

看起来 Lighttpd 必须关闭标准输出当它启动时,所以你不能在那里发送输出,但是你发送访问日志至标准错误

accesslog.filename = "/dev/fd/2"

(或者/proc/self/fd/2如果您愿意的话。)

如果你真的想登录标准输出代替标准错误,你可以执行一些 fd 重定向技巧,如下所示这里

  1. 将新的 fd 重定向到原始 stdout:

    #!/bin/sh
    exec 3>&1
    lighttpd -D -f /etc/lighttpd/lighttpd.conf
    
  2. 将访问日志指向新的 fd:

    accesslog.filename = "/dev/fd/3" 
    

这需要用 shell 脚本覆盖现有的容器启动命令。

相关内容