Где 'регистратор' регистрирует свои сообщения к в Дуге Linux?

  • local встроенное, не ключевое слово, таким образом, local files=(…) не анализируется как присваивание массива, но как строковое присвоение. Запишите присвоение отдельно из объявления. (Уже найденный llua, но примечанием, которое необходимо инициализировать files к пустому массиву или объявляют переменную с typeset -a, иначе массив запускается с побочного пустого элемента.)
  • Массивы Zsh пронумерованы от 1, не от 0 как в ударе и ksh, таким образом, ${files[0]} должен быть записан $files[1]. С другой стороны, скажите zsh вести себя способом, что это более совместимо с ksh и ударом: поместить emulate -L ksh в начале функции.
  • Если Вы не идете emulate маршрут, Ваш _notes функция распечатает zsh: no matches found: foo* если нет никакого завершения для foo, потому что значением по умолчанию, несоответствующим шарикам, инициировали ошибку. Добавьте спецификатор шарика N получить пустой массив, если там не идет ни в какое сравнение и тестируют, пуст ли массив.
  • Существует другая ошибка в Вашем _notes функция, которая влияет на примечания в подкаталогах: необходимо снять префикс до завершения, так, чтобы если, например. ~/notes/foo/bar существует и Вы вводите n b, COMPREPLY набор должен содержать b, нет foo/b.
  • Если Вы хотите сохранить файл, это читаемо и ударом и zsh:

    type emulate >/dev/null 2>/dev/null || alias emulate=true
    function n() {
      emulate -L ksh
      local arg; typeset -a files
      for arg; do files+=( ~/".notes/$arg" ); done
      ${EDITOR:-vi} "${files[@]}" 
    }
    
    function nls() {
      tree -CR --noreport $HOME/.notes | awk '{ 
          if (NF==1) print $1; 
          else if (NF==2) print $2; 
          else if (NF==3) printf "  %s\n", $3 
        }'
    }
    
    # TAB completion for notes
    function _notes() {
      emulate -L ksh
      local x files
      files=($HOME/.notes/**/"$2"*)
      [[ -e ${files[0]} ]] || return 1
      COMPREPLY=()
      for x in "${files[@]}"; do
        COMPREPLY+=("$2${x#$HOME/.notes*/$2}")
      done
    }
    complete -o default -F _notes n
    

    Если Вы хотите портировать свой код на zsh:

    function n() {
      local files
      files=(${@/#/~/.notes/})
      ${EDITOR:-vi} $files
    }
    
    function nls() {
      tree -CR --noreport $HOME/.notes | awk '{ 
          if (NF==1) print $1; 
          else if (NF==2) print $2; 
          else if (NF==3) printf "  %s\n", $3 
        }'
    }
    
    # TAB completion for notes
    function _notes() {
      setopt local_options bare_glob_qual
      local files
      files=(~/.notes/**/$2*(N))
      ((#files)) && COMPREPLY=($2${^files##~/.notes*/$2})
    }
    complete -o default -F _notes n
    
18
23.09.2017, 23:14
2 ответа

Поскольку сообщения журнала не появляются в журнале нигде, я подозреваю, что у Вас нет системного журнала к журналируемой передаче настроенным правильно, и сообщения просто становятся отброшенными. Так как Вы находитесь на Arch, это легко зафиксировать. Удостоверьтесь что syslog-ng пакет установлен:

pacman -S syslog-ng

Затем удостоверьтесь, что это включено на начальной загрузке:

systemctl enable syslog-ng

Наконец, начиная с включения сервисов автоматически не запускает их, запускают сервис:

systemctl start syslog-ng

Посмотрите эту страницу Arch Wiki для деталей.

Вот некоторый фон на том, почему эта проблема происходит:

Существует определенный способ зарегистрироваться к классическому системному журналу, и существует определенный способ зарегистрироваться к новому журналу systemd. Они являются несовместимыми; заявки, которые поддерживают системный журнал, не могут быть волшебно поданы для поддержки журнала - автор должен явно реализовать эту опцию. Приложения, которые поддерживают журнал systemd, обычно упоминаются как поддержка "встроенного API" при работе systemd системы.

Начиная с системного журнала API и журналируемый API отличаются, приложениям, которые не поддерживают журналируемый API, просто отбросят их сообщения журнала. Это - то, что происходило в Вашем случае.

syslog-ng задание пакета состоит в том, чтобы перевести вызовы API системного журнала в журналируемые вызовы API. Таким образом сообщения системного журнала в конечном счете превращают его в журнал.

15
27.01.2020, 19:46
  • 1
    syslog-ng был установлен, но не включен, я принял журналируемый, заменил его полностью. logger только способный говорить с системным журналом? Что корректный путь состоит в том, чтобы зарегистрировать к журналируемому затем? –  michas 02.01.2014, 03:08
  • 2
    @michas я добавил раздел, который, надо надеяться, разъяснит тот –  strugee 02.01.2014, 03:16
  • 3
    " [..] для перевода вызовов API системного журнала в журналируемые вызовы API" - Насколько я вижу перевод только работает наоборот: Я нахожу все сообщения в/var/log/, но только журналируемых в journalctl. –  michas 02.01.2014, 03:28
  • 4
    @michas, который может быть чем-то, что журналировало, делает, я не уверен. syslog-ng передает сообщения, адресованные системному журналу к журналируемому. –  strugee 02.01.2014, 03:33
  • 5
    Делает logger foobar;journalctl|grep foobar в Вашей системе перечисляют запись? –  michas 02.01.2014, 04:00

Некоторые демоны не записывали журналы в /var/log/в Arch Linux, и конфигурация для syslog-ngотличается от других ответов, которые я видел.

Обычной службы syslog-ng.serviceздесь нет, вместо этого она называется syslog-ng@default.service.

Это не сработает:

# systemctl enable syslog-ng
Failed to enable unit: Unit file syslog-ng.service does not exist.

Я должен сделать это немного иначе, согласно Arch Wiki:

# systemctl start syslog-ng@default.service
# systemctl enable syslog-ng@default.service
Created symlink /etc/systemd/system/multi-user.target.wants/syslog-ng@default.service → /usr/lib/systemd/system/syslog-ng@.service.
#
0
27.01.2020, 19:46

Теги

Похожие вопросы