Можно просто отредактировать /etc/syslog.conf
файл и, везде, где /var/adm/messages
появляется, копируйте строку и замену /var/adm/messages
@remoteSystem
с remoteSystem
будучи IP-адресом или именем хоста удаленного сервера, куда отправить журналы.
например:
прежде:
...
*.err;kern.debug;daemon.notice;mail.crit /var/adm/messages
...
после:
...
*.err;kern.debug;daemon.notice;mail.crit /var/adm/messages
*.err;kern.debug;daemon.notice;mail.crit @jaylogserver
...
Перезапустите syslogd для изменения, которое будет принято во внимание:
# svcadm restart system-log
Обратите внимание, что удаленный сервер должен быть настроен для принятия удаленных сообщений. Если бы на Солярисе также, который был бы сделан с этой командой:
# svccfg -s system-log setprop config/log_from_remote = true
# svcadm restart system-log
Для вашего обновленного вопроса:
awk '
/"rarely_used_module"/ && /OUT:/ { nc[$NF]++ ; c++ }
END {
printf "Number of license checkouts for rarely_used_module: %d\n", c
for (i in nc) printf "User: %s (%d)\n", i, nc[i]
}
' logfile.txt
создает этот вывод:
Number of license checkouts for rarely_used_module: 4
User: doej@server.domain (2)
User: smithj@server.domain (2)
Вот пример того, как можно подойти к таким задачам, используя awk
:
awk '
BEGIN { SUBSEP = ", " ; OFS = ": " }
{ m[$(NF-1)]++ }
{ n[$(NF-1)] = n[$(NF-1)] " " $NF }
{ nc[$(NF-1),$NF]++ }
END {
print "\n=== count modules:"
for (i in m) print i, m[i]
print "\n=== collect names using modules:"
for (i in n) print i, n[i]
print "\n=== count names using modules:"
for (i in nc) print i, nc[i]
}
' logfile.txt
Explanation:
{ m[$(NF-1)]++ }
- счетчик инкрементов для второго последнего поля (модуля) во входных данных{ n[$(NF-1)] = n[$(NF-1)] " " $NF }
- конкапсулирует последнее поле (имена) для каждого ключа (модуля){ nc[$(NF-1)), $NF]++ }
- счетчик инкрементов для ключевого элемента (имя, модуль)С вашими данными-образец выдаст этот вывод:
=== count modules:
"rarely_used_module": 1
"different_module": 2
"certain_module": 3
=== collect names using modules:
"rarely_used_module": doej@server.domain
"different_module": doej@server.domain userg@server.domain
"certain_module": doej@server.domain smithj@server.domain smithj@server.domain
=== count names using modules:
"different_module", userg@server.domain: 1
"different_module", doej@server.domain: 1
"certain_module", smithj@server.domain: 2
"rarely_used_module", doej@server.domain: 1
"certain_module", doej@server.domain: 1
Когда мне нужно что-то более сложное, чем изменение или сопоставление каждой строки, я использую Python, потому что это язык общего назначения. Он может быть более подробным, чем awk
(кстати, есть pawk
, Python awk), но он также дает вам хорошо документированный и легко расширяемый код.
Вот скрипт Python 2 для вашей задачи:
from collections import defaultdict
FILE = 'module.txt'
# Global table of usages is
# dict [ module_name ] -> dict [ user_name ] -> count
usage = defaultdict(lambda : defaultdict(int))
# Read, parse data and add usage count where needed
with open(FILE) as f:
for line in f:
# Split using spaces and pick last 2 fields,
# strip unncessary characters
fields = line.split()
user = fields[-1].rstrip()
module_name = fields[-2].strip('"')
usage[module_name][user] += 1
# Now print pretty results
for module_name, module_usage in usage.items():
print '====> ', module_name
for user, count in module_usage.items():
print '\t', user, count
Он напечатает следующие данные для вашего образца:
====> different_module
doej@server.domain 1
userg@server.domain 1
====> rarely_used_module
doej@server.domain 1
====> certain_module
smithj@server.domain 2
doej@server.domain 1