Если вы посмотрите на исходный код рамки здесь , вы увидите, что он не будет делать ежедневные журналы, а скорее записывается в один файл журнала lumen.log
. Существует общедоступный метод, доступный configureMonologUsing
в здесь и ссылка на здесь , которую вы можете использовать для переопределения поведения по умолчанию без расширения приложения.
Lumen просто устанавливает обработчик для монолога, так что еще одно хорошее решение: вы можете сделать это:
setFormatter(new LineFormatter(null, null, true, true));
$this->app['log']->setHandlers($handlers);
}
/**
* Register the log service.
*
* @return void
*/
public function register()
{
// Log binding already registered in vendor/laravel/lumen-framework/src/Application.php.
}
}
Затем не забудьте добавить поставщика услуг в ваш Lune bootstrap / app.php:
$app->register(\App\Providers\LogServiceProvider::class);
В C для получения текущего IP я использую:
int s;
struct ifreq ifr = {};
s = socket(PF_INET, SOCK_DGRAM, 0);
strncpy(ifr.ifr_name, "eth0", sizeof(ifr.ifr_name));
if (ioctl(s, SIOCGIFADDR, &ifr) >= 0)
printf("%s\n",
inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));
Замена "eth0" с интерфейсом Вы смотрите на. Все, что теперь необходимо сделать, опросить для разнообразия.
Это не легко всегда. Каждый дистрибутив Linux использует различные места для хранения IP-адресов, и т.д. (больше изменения, если Вы рассматриваете другие варианты UNIX). Вы можете использование, например, /sbin/ifconfig
для получения IP-адресов интерфейсов, но Вы не можете даже быть уверены, найдете ли Вы, что оно в этом месте, или вообще, и т.д.
кроме того, учитывая Вас имеет тот исполняемый файл, необходимо настроить поток, назвав его для получения данных с установленным сроком (скажите 5 секунд), и интерпретируйте вывод. Это может варьироваться, например, если у Вас есть мосты, и т.д. и т.д. Таким образом, это не легко.
решение для А, которое прибывает по моему мнению, если у Вас есть возможность использования GNOME или некоторого другого широко распространенного распределения как KDE, можно полагаться на сообщения/информацию, которые они дают. Например, NetworkManager
выводы сигнал к стандартная шина DBUS , когда устройство изменяется. Необходимо реализовать слушателя для тех, сигнализируют. Информация здесь (не работающий правильно теперь, таким образом, вот кэш ). Отметьте различные сообщения, когда новый интерфейс добавляется, или когда один из них изменяет IP-адрес. Это - лучший способ, которым я могу думать прямо сейчас.
Если Ваши пользователи используют NetworkManager, можно опросить NetworkManager. Соединение. Активный и NetworkManager. IP4Config через D-шину для получения более перекрестного распределения способ определить эту информацию.
Если iproute2 будет установлен, и Вы находитесь на 2,6 ядрах, [то 111]
/sbin/ip monitor
произведет изменения в локальном интерфейсном состоянии и адресует к stdout. Ваша программа может считать это.
Вы могли также использовать тот же низкоуровневый механизм, как iproute2 инструмент делает (я думаю, что это - сокет netlink).
Один путь состоял бы в том, чтобы записать задание крона, которое содержит вызов к одному gethost семейство библиотечных функций. При использовании gethostbyname (), можно сравнить возвращаемые значения h_addr_list. Посмотрите человека gethostbyname.
, Если Вы, хотят сделать это из Вашей программы, породить pthread, который делает то же самое, затем спит в течение некоторого произвольного промежутка времени.
Предложение ste использовать ioctl SIOCGIFADDR раньше было технически правильным, к сожалению, оно ненадежно для современных систем Linux, где один интерфейс может иметь несколько адресов без использования суб-интерфейсов (например, eth0 : 1), как это было сделано с уже устаревшим ifconfig.
Из справочной страницы rtnetlink:
ОПИСАНИЕ
Rtnetlink позволяет читать и изменять таблицы маршрутизации ядра. Он используется внутри ядра для связи между различными подсистемами, хотя это использование здесь не описано, а также для связи с программами пользовательского пространства. Сетевые маршруты, IP-адреса, параметры канала, настройки соседей, дисциплины очередей, классы трафика и классификаторы пакетов могут управляться через сокеты NETLINK_ROUTE. Он основан на сообщениях netlink, дополнительную информацию см. В netlink (7).
вот так .. это делает это без опроса.
он прослушивает только RTM_NEWADDR, но его должно быть легко изменить для поддержки RTM_DELADDR, если вам нужно
#include <stdio.h>
#include <string.h>
#include <netinet/in.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
#include <net/if.h>
int
main()
{
struct sockaddr_nl addr;
int sock, len;
char buffer[4096];
struct nlmsghdr *nlh;
if ((sock = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE)) == -1) {
perror("couldn't open NETLINK_ROUTE socket");
return 1;
}
memset(&addr, 0, sizeof(addr));
addr.nl_family = AF_NETLINK;
addr.nl_groups = RTMGRP_IPV4_IFADDR;
if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
perror("couldn't bind");
return 1;
}
nlh = (struct nlmsghdr *)buffer;
while ((len = recv(sock, nlh, 4096, 0)) > 0) {
while ((NLMSG_OK(nlh, len)) && (nlh->nlmsg_type != NLMSG_DONE)) {
if (nlh->nlmsg_type == RTM_NEWADDR) {
struct ifaddrmsg *ifa = (struct ifaddrmsg *) NLMSG_DATA(nlh);
struct rtattr *rth = IFA_RTA(ifa);
int rtl = IFA_PAYLOAD(nlh);
while (rtl && RTA_OK(rth, rtl)) {
if (rth->rta_type == IFA_LOCAL) {
char name[IFNAMSIZ];
if_indextoname(ifa->ifa_index, name);
char ip[INET_ADDRSTRLEN];
inet_ntop(AF_INET, RTA_DATA(rth), ip, sizeof(ip));
printf("interface %s ip: %s\n", name, ip);
}
rth = RTA_NEXT(rth, rtl);
}
}
nlh = NLMSG_NEXT(nlh, len);
}
}
return 0;
}